语言:C 操作系统:Ubuntu
我只是尝试使用以下命令创建FIFO命名管道:
state = mknod("pipe.txt", S_IFIFO | 0666, 0);
问题是我总是将状态值设为-1(意味着它已经失败)而不是0。
perror返回'pipe.txt:文件存在'
我不知道我应该如何调试这样的问题或者可能是什么原因,希望任何代码都能指导我出错。
(注意:文件pipe.txt与源文件存在于同一路径上。)
答案 0 :(得分:4)
阅读:int mknod(const char *path, mode_t mode, rdev_t dev_identifier);
一般说明:
创建一个新的字符特殊文件或FIFO特殊文件(命名管道),并在path参数中指定路径名。
如果文件已经存在,那么它将失败并显示错误:File exists
要避免此错误,请删除(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;
}
答案 1 :(得分:0)
你应该检查errno
以查看错误是什么,但它可能是EEXIST
,因为我相信如果文件已经存在会发生什么。
来自Linux documentation for mknod
:
如果路径名已存在,或者是符号链接,则此调用将失败,并显示EEXIST错误。
但是,如果文件已存在并且 是您在早期运行中创建的管道,则可以安全地重新打开它。所有mknod
(及其通常首选的表兄,mkfifo
)确实是创建 FIFO,您仍然必须在两端打开它才能进行数据传输。< / p>