locking de fichier dans le système unix en utilisant c et fcntl

J’essaie d’apprendre la programmation en unix. J’ai donc lu le guide Beejs et essayé d’en savoir plus sur le locking de fichiers.

Donc, je viens de prendre un exemple de code de lui et j’ai essayé de lire si le fichier est verrouillé ou non, mais chaque fois que je le fais, j’obtiens errno 22 qui signifie argument non valide. J’ai donc vérifié mon code pour des arguments invalides, mais je n’ai pas pu les trouver. Est-ce que quelqu’un peut m’aider?

Mon erreur se produit dans ceci:

  if( fcntl(fd, F_GETLK, &fl2) < 0 ) { printf("Error occured!\n"); } 

Le code complet:

  /* ** lockdemo.c -- shows off your system's file locking. Rated R. */ #include  #include  #include  #include  #include  int main(int argc, char *argv[]) { /* l_type l_whence l_start l_len l_pid */ struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0 }; struct flock fl2; int fd; fl.l_pid = getpid(); if (argc > 1) fl.l_type = F_RDLCK; if ((fd = open("lockdemo.c", O_RDWR)) == -1) { perror("open"); exit(1); } printf("Press  to try to get lock: "); getchar(); printf("Trying to get lock..."); if (fcntl(fd, F_SETLKW, &fl) == -1) { perror("fcntl"); exit(1); } printf("got lock\n"); printf("Press  to release lock: "); getchar(); fl.l_type = F_UNLCK; /* set to unlock same region */ if (fcntl(fd, F_SETLK, &fl) == -1) { perror("fcntl"); exit(1); } printf("Unlocked.\n"); printf("Press  to check lock: "); getchar(); if( fcntl(fd, F_GETLK, &fl2) < 0 ) { printf("Error occured!\n"); } else{ if(fl2.l_type == F_UNLCK) { printf("no lock\n"); } else{ printf("file is locked\n"); printf("Errno: %d\n", errno); } } close(fd); return 0; } 

J’ai juste ajouté fl2 et la partie en bas.

fcntl(fd, F_GETLK, &fl2) obtient le premier verrou qui bloque la description du verrou dans fl2 et écrase fl2 avec cette information. (Comparer fcntl – contrôle de fichier )

Cela signifie que vous devez initialiser fl2 à un struct flock valide avant d’appeler fcntl() .