2014-07-12 83 views
1

我試圖在unix中學習編程c。所以我通過Beejs Guide閱讀並嘗試瞭解更多關於文件鎖定的內容。unix系統中使用c和fcntl的文件鎖定

所以我剛剛從他那裏拿了一些代碼示例,並試圖讀出文件是否被鎖定,但每次我都會得到errno 22,它代表無效的參數。所以我檢查了我的代碼中無效的參數,但我無法找到它們。有人能幫助我嗎?在這種情況

我的錯誤:

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

的完整代碼:

/* 
    ** lockdemo.c -- shows off your system's file locking. Rated R. 
    */ 

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <fcntl.h> 
    #include <unistd.h> 

    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 <RETURN> 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 <RETURN> 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 <RETURN> 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; 
    } 

我只是說fl2和底部的一部分。

回答

0

fcntl(fd, F_GETLK, &fl2)獲取阻止鎖定說明的第一個鎖定在fl2中,並用該信息覆蓋fl2。 (比較fcntl - file control

這意味着,你必須調用fcntl()之前初始化fl2一個有效struct flock

+0

謝謝。初始化後,所有內容都正在運行。但是如果我在鎖定文件後檢查鎖,我的支票就會顯示「無鎖」。這部分是出於beejs指南,我看不到任何錯誤。 – user1550036

+0

@ user1550036:在我的OS X上,'struct flock'的成員依次爲'l_start,l_len,l_pid,l_type,l_whence'。所以你的初始化可能是錯誤的。更好地分配成員:'fl.l_type = ...'等等。 –