我在使用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;
}发布于 2015-09-19 05:12:08
根据fcntl(3)
EBADF:
fd不是打开的文件描述符,或者命令是F_SETLK或F_SETLKW,文件描述符打开模式与请求的锁类型不匹配。
而且,您没有按照上面的手册页的要求将lock的lock成员设置为F_WRLCK。因此,只需在第一次调用fcntl()之前添加这一行,一切都会好起来的。
lock.l_type = F_WRLCK;发布于 2015-09-19 06:11:39
来自fcntl手册页@KemyLand (见上文)
EBADF不是一个打开的文件描述符,或者命令是F_SETLK或F_SETLKW,并且文件描述符打开模式与请求的锁类型不匹配。
这可能意味着,问题就在这里
fp = fopen(argv[1], "w");虽然这个程序似乎在下面的选项中很好地工作,但我发现很难解释为什么它似乎与这些很好地工作,这与开放逻辑是肯定的。
fp = fopen(argv[1], "a+");
fp = fopen(argv[1], "r");
fp = fopen(argv[1], "w+");https://stackoverflow.com/questions/32664302
复制相似问题