2012-06-16 64 views
0

我在我的ubuntu機器上執行了下面的c代碼...我已經閱讀了關於fcntl()用來鎖定文件和甚至讀如果F_WRLCK opton被設置爲。 ..所以我按放棄鎖之前啓動這個程序,進入我試圖通過file1.cpp直接雙擊打開文件兩個ways-並在一個新的終端上運行不同的C程序都...時間被打開文件...所以怎麼的fcntl()允許這些文件打開時F_WRLCK設置...filelock允許打開文件

int main(int argc, char *argv[]) 
{ 

struct flock fl = {F_WRLCK, SEEK_SET, 0,  0,  0 }; 
int fd; 

fl.l_pid = getpid(); 

if ((fd = open("/home/file1.cpp", O_WRONLY)) == -1) 
{ 
    perror("open"); 
    exit(1); 
} 


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


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"); 

close(fd); 

return 0; 
} 

回答

0

fcntl鎖是純粹的諮詢鎖。他們只效果是造成fcntlF_SETLK呼叫時無法獲得的鎖阻塞。它們對IO操作完全沒有影響。當需要同步時,在執行IO之前取決於您的程序需要的鎖。

這完全類似於使用互斥來保護在存儲器中的對象。互斥體不會阻止您讀取或寫入內存地址;它只是一個協議,用於確保您的程序只能讀取和寫入適當的時間。

+0

@ R..i不明白...真正的fcntl()塊,直到沒有獲得鎖,但獲得了鎖之後,不應該讀取或寫入該文件來禁止同步,因爲我已經獲得一個寫鎖....如果沒有那麼應該使用哪個函數 – avinash

+0

@ R ..我知道了......只需要閱讀[this](http://www.thegeekstuff.com/2012/04/linux-文件鎖定類型/),你的答案變得清晰 – avinash

相關問題