如何在C中制作一个fifo?

时间:2015-05-27 00:49:19

标签: linux c fifo

我必须在Ubuntu的C程序中使用mkfifo。但是我在编译时遇到错误:no such file or directory

我认为问题是因为我没有设置panel_fifo环境变量。但我不知道怎么能这样做。

以下是我用来测试此方法的代码:

char *myfifo="./sock/myfifo";

if (mkfifo(myfifo,0777)<0)
perror("can't make it");

if (fd=open(myfifo,O_WRONLY)<0)
 perror("can't open it");

我用以下代码编译:

gcc gh.c -o gh

当我跑步时,我收到此错误消息:

can't make it:no such file or directory
can't open it:no such file or directory

2 个答案:

答案 0 :(得分:4)

这是因为目录袜子不存在。

在终端中:

christian@fujiu1404:~/tmp/t2$ ls
t2.c
christian@fujiu1404:~/tmp/t2$ cat t2.c 
#include <fcntl.h>

main() {

int fd;
char *myfifo="./sock/myfifo";

if (mkfifo(myfifo,0777)<0)
  perror("can't make it");

if (fd=open(myfifo,O_WRONLY)<0)
  perror("can't open it");

}
christian@fujiu1404:~/tmp/t2$ cc t2.c
christian@fujiu1404:~/tmp/t2$ ./a.out 
can't make it: No such file or directory
can't open it: No such file or directory
christian@fujiu1404:~/tmp/t2$ mkdir sock
christian@fujiu1404:~/tmp/t2$ ./a.out 

请注意,该程序尚未完成,但您的fifo确实存在。

现在在第二个终端,将一个字符串放入fifo

christian@fujiu1404:~/tmp/t2$ ls -l sock/
total 0
prwxrwxr-x 1 christian christian 0 May 27 06:45 myfifo
christian@fujiu1404:~/tmp/t2$ echo abc >sock/myfifo 

注意回声也被暂停

现在在第三个终端,从fifo读取

christian@fujiu1404:~/tmp/t2$ cat sock/myfifo 
abc
christian@fujiu1404:~/tmp/t2$ 

现在注意所有程序都已完成并退出(在所有终端中)

答案 1 :(得分:1)

你试试

myfifo("./sock/myfifo", ...)

你得到了

  

没有这样的文件或目录

ENOENT

然后,您需要查找相关文档,并在man 3 mkfifo中找到以下内容:

  

<强>错误

     

[...]

     

ENOENT 路径名中的目录组件不存在或是悬挂的符号链接。

从这一切可能会导致./sock不存在。