首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >坏文件描述符文件

坏文件描述符文件
EN

Stack Overflow用户
提问于 2015-09-19 04:45:36
回答 2查看 3.7K关注 0票数 0

我在使用fcntl()和fileno时遇到麻烦。我在执行锁机制时遇到了麻烦。但是,当我试图关闭一个文件时,我会得到以下错误:fcntl:糟糕的文件描述符。我正在使用fileno获得文件描述和我得到-1。

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

发布于 2015-09-19 05:12:08

根据fcntl(3)

EBADFfd不是打开的文件描述符,或者命令是F_SETLKF_SETLKW,文件描述符打开模式与请求的锁类型不匹配。

而且,您没有按照上面的手册页的要求将locklock成员设置为F_WRLCK。因此,只需在第一次调用fcntl()之前添加这一行,一切都会好起来的。

代码语言:javascript
复制
lock.l_type = F_WRLCK;
票数 2
EN

Stack Overflow用户

发布于 2015-09-19 06:11:39

来自fcntl手册页@KemyLand (见上文)

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

这可能意味着,问题就在这里

代码语言:javascript
复制
fp = fopen(argv[1], "w");

虽然这个程序似乎在下面的选项中很好地工作,但我发现很难解释为什么它似乎与这些很好地工作,这与开放逻辑是肯定的。

代码语言:javascript
复制
fp = fopen(argv[1], "a+");
fp = fopen(argv[1], "r");
fp = fopen(argv[1], "w+");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32664302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档