坏文件描述符fileno

时间:2015-09-19 04:45:37

标签: c file operating-system

我在使用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;
}

2 个答案:

答案 0 :(得分:2)

根据fcntl(3)

  

EBADF fd不是一个打开的文件描述符,或者命令是F_SETLKF_SETLKW且文件描述符打开模式与请求的锁定类型不匹配

而且,按照上面的手册页的规定,您l_type的{​​{1}}成员设置为lock。因此,只需在第一次调用F_WRLCK之前添加此行,一切都会正常。

fcntl()

答案 1 :(得分: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+");