Nu știu de ce acest cod nu funcționează sub NFS4, folosind NFS3 funcționează perfect. Ideea este de a evita ca fișierul să fie scris în timp ce un proces încă îl citește.
Aș dori să depanez, dar administratorul nostru de sistem nu poate. Ceea ce ar putea fi motivul. În cadrul instalării noastre NFS4, intru întotdeauna în această stare
dacă (flock(fp,LOCK_EX) == -1)
printf("Eroare: fisierul %s este deja blocat\n", fileName);
intregul program este:
#include <sys/file.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv){
dacă (argc<2){
printf("Utilizare:\n a.out fileName\n");
întoarcere 1;
}
char *fileName=argv[1];
int fp;
/* blochează fișierul, știu că un proces poate scrie
făcând informațiile mele inutile*/
fp=open(fileName,O_RDONLY);
dacă (flock(fp,LOCK_EX) == -1){
printf("Eroare: fisierul %s este deja blocat\n", fileName);
}
altfel{
printf("OK: fisierul %s a fost blocat\n",fileName);
}
/* citește și analizează numele fișierului
alt proces nu ar trebui să poată scrie sau
modificați numele fișierului în timp ce îl citesc
*/
returnează 0;
}
Editați | ×:
as vrea sa clarific. Acesta este un fragment din codul pe care îl folosesc. fileName ar trebui să fie un fișier existent valid
Citesc un fileName și fac o copie, editând câteva părți. Știu, în timp ce fac asta, un proces extern poate actualiza fileName. Aș dori să folosesc un semafor pentru a evita modificările asupra acestui fișier până când nu termin cu el. Acest program a funcționat perfect până când nu mai face asta. Singura diferență este sistemul de fișiere în care se află numele fișierelor. A fost actualizat din NFS3 în NFS4. Chiar și sistemul de operare (SLE15.2) este același cu kernel-ul 5.3.18, iar utilizarea strerror(errno) produce o eroare seg pe NFS4. Singurul indiciu când imprimez („%d”, eroare) este 9 care ar trebui să fie „descriptor de fișier greșit”
Multumesc pentru ajutor
Julia