我在使用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 :(得分:2)
根据fcntl(3)
:
EBADF :
fd
不是一个打开的文件描述符,或者命令是F_SETLK
或F_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+");