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()
.