2015-09-19 254 views
0

我無法使用fcntl()和fileno。我在執行鎖機制時遇到問題。但是,當我嘗試關閉文件時,出現以下錯誤:fcntl:錯誤的文件描述符。我使用fileno來獲取文件描述,我得到-1。壞文件描述符文件無

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

//args ==path to the file 
int main(int argc, char *argv[]) 
{ 
    struct flock lock = {F_WRLCK, SEEK_SET, 0,  0,  0 }; 
    int fd; 
    FILE* fp; 

    lock.l_pid = getpid(); 

    if (argc > 1) 
     lock.l_type = F_RDLCK; 

    printf("%s\n", argv[1]); 

    fp = fopen(argv[1], "w"); 

    if(fp==NULL) 
    { 
     perror("fopen"); 
     exit(1); 
    } 

    fd=fileno(fp); 

    getchar(); 

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

    lock.l_type = F_UNLCK; 


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

    close(fd); 

    return 0; 
} 
+0

你應該處理argc <= 1 –

回答

2

根據fcntl(3)

EBADFfd不是打開文件描述符,或或命令是F_SETLKF_SETLKW和文件描述符打開模式不相匹配請求的鎖的類型

而且,它發生,你是不是lock成員l_type設置F_WRLCK,由人網頁上面規定的。因此,只需在第一次致電fcntl()之前添加此行,一切都會好起來的。

lock.l_type = F_WRLCK; 
0

從手動的fcntl頁面作爲@KemyLand尖頭上述

EBADF fd是不打開文件描述符,或命令是F_SETLK 或F_SETLKW和文件描述符打開模式 不匹配與請求的鎖的類型。

這可能意味着,問題是出在這裏

fp = fopen(argv[1], "w"); 

雖然這個方案似乎與下面的選項運作良好,但我發現很難解釋爲什麼它似乎與這些很好地工作,可以肯定地打開邏輯。

fp = fopen(argv[1], "a+"); 
fp = fopen(argv[1], "r"); 
fp = fopen(argv[1], "w+"); 
+0

問題是因爲if(argc> 1)lock.l_type = F_RDLCK;這不適用於「w」。我正在讀取鎖定,但試圖寫出哪些不能很好地協同工作 – atkawa7