语言:C 操作系统:Ubuntu
我只是尝试使用以下命令创建一个 FIFO 命名管道:
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 特殊文件(命名管道),路径名在 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;
}
您应该检查errno
一下错误是什么,但这可能是EEXIST
因为我相信如果文件已经存在就会发生这种情况。
如果路径名已经存在,或者是符号链接,则此调用将失败并出现 EEXIST 错误。
但是,如果该文件已经存在并且是您在之前的运行中创建的管道,您可以安全地重新打开它。所有mknod
(以及它通常首选的表亲,mkfifo
)实际上是创建FIFO,您仍然必须在两端打开它才能进行数据传输。