运行mkfifo的程序不起作用

时间:2016-12-14 14:00:03

标签: c named-pipes fifo mkfifo

我试图使用mkfifo命令在linux下在c上创建命名管道。但是当我运行该程序时,我要么得到一个"没有这样的文件或目录"错误或绝对没有(控制台不显示任何内容)

这是我的代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#define MAX_LINE 80

int main(int argc, char** argv) {
int create;
//mkfifo("/tmp/myfifo", 0666);
create = mkfifo("tmp/myfifo", 0666);
if (create==-1)
{
    printf("error%s", strerror(errno));
}
char line[MAX_LINE];
int pipe;
pipe = open("/tmp/myfifo", O_WRONLY);
 if (pipe==-1)
 {printf("error");
 }
printf("Enter line: ");
fgets(line, MAX_LINE, stdin);
write(pipe, line, strlen(line));
sleep (100);
close(pipe);
return 0;
}

我还在学习,而且我不明白我做错了什么。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

要使命名管道有用,有人必须阅读它,有人必须编写它。通常这将是2个独立的程序。你的程序是作家。读者在哪里?

如果没有读者,程序在O_WRONLY打开时阻止是正常的。因此,当您的程序似乎什么都不做时,它实际上只是这样做:

pipe = open("/tmp/myfifo", O_WRONLY);

等待读者出现。

在另一个终端中,运行cat /tmp/myfifo。读者的存在将使作者取得进步。您的程序将被唤醒并转到Enter line提示符,您输入的内容将由cat读取并写入第二个终端。

另一个问题是文件名不一致。在一个地方你写了"tmp/myfifo"没有前导斜杠,所以你试图在当前工作目录内的tmp目录中创建命名管道。如果tmp目录不存在,则No such file or directory将成为结果。