C:使用mknod()创建命名管道不起作用

时间:2013-05-15 07:43:29

标签: c pipe mknod

语言:C 操作系统:Ubuntu

我只是尝试使用以下命令创建FIFO命名管道:

state = mknod("pipe.txt", S_IFIFO | 0666, 0);

问题是我总是将状态值设为-1(意味着它已经失败)而不是0。

perror返回'pipe.txt:文件存在'

我不知道我应该如何调试这样的问题或者可能是什么原因,希望任何代码都能指导我出错。

(注意:文件pipe.txt与源文件存在于同一路径上。)

2 个答案:

答案 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>