语言:C 操作系统:Ubuntu
我只是想使用以下命令创建一个命名管道:
state = mknod("pipe.txt", S_IFIFO | 0666, 0);
问题是我总是得到状态值为-1(表示失败),而不是0。 perror返回“pipe.txt:文件已存在”
我不知道应该如何调试这个问题或者原因是什么,希望任何人都可以指导我错在哪里。
(注意:文件pipe.txt存在于源文件相同的路径中。)
阅读:int mknod(const char *path, mode_t mode, rdev_t dev_identifier);
概述:
使用在路径参数中指定的路径名创建新的字符特殊文件或FIFO特殊文件(命名管道)。
如果文件已经存在,则会出现错误:文件已存在
为了避免这个错误,要删除(unlink()
)文件,就像我在下面的代码中所做的一样(参考注释):
int main() {
char* file="pipe.txt";
unlink(file); // Add before mknod()
int state = mknod(file, S_IFIFO | 0666, 0);
if(state < 0){
perror("mknod() error");
}
return 0;
}
#include
语句将其转换为最小工作示例? - puk您应该检查errno
以查看错误是什么,但可能是EEXIST
,因为我认为如果文件已经存在,则会发生这种情况。
如果路径名已经存在,或者是符号链接,则此调用将失败并显示EEXIST错误。
然而,如果文件已经存在且就是您在之前运行中创建的管道,则可以安全地重新打开它。所有mknod
(及其经常使用的近亲,mkfifo
)实际上都是创建 FIFO,您仍然必须在两端打开它才能开始数据传输。
mknod()
失败后,使用perror("mknod: pipe.txt")
。 - jxhmkfifo
)返回-1
时,表示出现了错误。要获取错误信息,您需要查看errno
。要打印errno
中的错误代码的可用字符串版本,请使用strerror
获取可打印字符串,或者使用perror
直接打印。但是,仅在函数失败(即返回-1
或NULL
或指定为失败返回值的内容)时才应检查errno
。 - Some programmer dude