3

语言:C 操作系统:Ubuntu

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

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

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

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

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

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

4

2 回答 2

5

阅读: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;
}
于 2013-05-15T08:05:04.610 回答
0

您应该检查errno一下错误是什么,但这可能是EEXIST因为我相信如果文件已经存在就会发生这种情况。

来自Linux 文档mknod

如果路径名已经存在,或者是符号链接,则此调用将失败并出现 EEXIST 错误。

但是,如果该文件已经存在并且您在之前的运行中创建的管道,您可以安全地重新打开它。所有mknod(以及它通常首选的表亲,mkfifo)实际上是创建FIFO,您仍然必须在两端打开它才能进行数据传输。

于 2013-05-15T07:47:13.540 回答