运行 mkfifo 的程序不起作用

Posted

技术标签:

【中文标题】运行 mkfifo 的程序不起作用【英文标题】:Program running mkfifo doesn't work 【发布时间】:2016-12-14 14:00:03 【问题描述】:

我正在尝试使用 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;

我还在学习,我不明白我做错了什么。感谢您的帮助。

【问题讨论】:

参见How to Ask,按照建议正确格式化和缩进。 【参考方案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 将是结果。

【讨论】:

我有第二个阅读器程序,从另一个终端窗口运行它只这样做:./test2 ttime__vdso_get_?@?@@

以上是关于运行 mkfifo 的程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 QT 应用程序不起作用?

从 xcode 推送通知运行应用程序时正在运行,但是在安装 ipa 时它不起作用

在设备上卸载应用程序后,颤动运行不起作用

推送通知在应用程序运行时不起作用(活动)[重复]

应用程序未运行时广播接收器不起作用

当 Lync 应用程序运行 UI 抑制时,GetAutomation() 不起作用