2013-01-16 10 views
3

無效的參數我米,文件鎖定在工作進程間通信 下面的代碼中的bug我... 當通過終端的Macintoshfnctl:用C

#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 f1 = {F_WRLCK , SEEK_SET , 0 , 0 , 0}; 
    int fd; 

    f1.l_pid = getpid() ; 

// if command line arguments , then assign a Read Lock 
if (argc > 1) 
{ 
    f1.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 , &f1) == -1) 
{ 
    perror("fcntl"); 
    exit(1); 
} 


printf("got lock !\n"); 
printf("Press <RETURN> to release lock:"); 
getchar(); 

f1.l_type = F_UNLCK ; //set to unlock same region 

if (fcntl(fd, F_SETLK , &f1) == -1) 
{ 
    perror("fcntl"); 
    exit(1); 
} 

printf("Unlocked .. \n"); 
close(fd); 

return 0; 
} 

運行,但出現以下錯誤: fnctl :無效的參數

plz幫助我在這個問題...

+1

_Which_'fcntl'調用它,讓這個錯誤嗎? –

+0

「試圖獲得塊」之後的一個 – Subbu

+0

先生,你有gud信譽點......你會爲c程序員創建一個聊天室......已經有一個房間 ..但不活動......並且不允許我問候隊列......所以,根據程序PLZ ..... – Subbu

回答

3

在MacOs上,struct flock的成員與Linux的順序不同。

爲了使您的代碼具有可移植性,您應該按名稱分配字段,而不是假定特定順序。

從MacOS的男子頁的fcntl:

  struct flock { 
      off_t  l_start; /* starting offset */ 
      off_t  l_len;  /* len = 0 means until end of file */ 
      pid_t  l_pid;  /* lock owner */ 
      short  l_type;  /* lock type: read/write, etc. */ 
      short  l_whence; /* type of l_start */ 
     }; 
+1

這是一個非常有效的觀點,可能會成爲OP面臨的問題的原因。 +1 – fayyazkl

+0

YES先生....謝謝!!!!! 它的工作......它正確地顯示文件鎖定,並等待獲得一個鎖... :)謝謝你! – Subbu

0

我想你的代碼,並沒有在Linux上最小的任何修改12 64位工作正常。

gcc lock.c 
-Compaq-6200-Pro-MT-PC ~/Dropbox/Misc $ ./a.out 1 
Press <RETURN> to try to get lock 
trying to get lock...got lock ! 
Press <RETURN> to release lock: 
Unlocked .. 
-Compaq-6200-Pro-MT-PC ~/Dropbox/Misc $ ./a.out 
Press <RETURN> to try to get lock 
trying to get lock...got lock ! 
Press <RETURN> to release lock: 
Unlocked .. 

當然,我在同一個文件夾中創建了一個lockdemo.c文件。

似乎你在mac上的鎖定API可能有問題。

+0

,如果沒有參數傳遞,文件應該得到WRITE LOCK ...但如果沒有參數傳遞,它將顯示上述error – Subbu

+0

help sir ...代碼在beej的ipc指南中給出 – Subbu

+0

你有寫訪問權限的文件lockdemo.c嗎?在本地創建它以確保 – fayyazkl