打开()时试图打开pipe道读取块

我有两个进程,一个服务器和一个客户端,应该通过pipe道(C ++,Linux)进行通信。 服务器用O_RDONLY标志打开pipe道,用O_WRONLY打开客户端。 然而,服务器在open函数中阻塞,而客户端似乎成功运行( open函数返回成功, write函数也是如此)。

我已经读过,如果O_NONBLOCK标志被设置,读取function将继续,但我不希望它继续,如果没有客户端连接 – 可以阻止, 直到客户端连接 ,但在我的情况下,它仍然阻止即使客户端运行完成后

你能否告诉我我做错了什么?

这里是代码:

 // Server side int pipe; int status, nr_read = 0; status = mkfifo(FIFO_NAME, 0666); if (status < 0) { // If the file already exists, delete it unlink(FIFO_NAME); // Try again status = mkfifo(FIFO_NAME, 0666); if(status < 0) { printf("mkfifo error: %d\n", status); return status; } } pipe = open(FIFO_NAME, O_RDONLY); printf("Never gets here...\n"); [...] nr_read = read(pipe, my_char_array, CHAR_ARRAY_SIZE); [...] close(pipe); unlink(FIFO_NAME); 

它永远不会到“printf”行…

 // Client side: int pipe, nr_sent = 0; int status = 0; pipe = open(FIFO_NAME, O_WRONLY); if (pipe < 0) { printf("open fifo error: %d\n", status); return pipe; } [...] nr_sent = write(pipe, my_char_array, CHAR_ARRAY_LENGTH); [...] close(pipe); 

编辑

我没有提到行#define FIFO_NAME "MYFIFO"

…这就是问题:正如Jody Hagins所说,path是一个相对的path,而进程是从不同的文件夹开始的,他们试图打开不同的文件。

Solutions Collecting From Web of "打开()时试图打开pipe道读取块"

在写入端完成管道之前,读取端不会完成阻塞打开。

如果您不想使用此功能,请打开读取端O_NONBLOCK ,并使用select来确定写入端何时建立了连接并相应地输入处理输入。

编辑

哎呀。 只是注意到,你说,即使运行客户端,你的服务器还没有完成开放。 真奇怪。 我只是剪切/粘贴你的代码,添加缺少的头文件和缺少的变量/常量后,运行服务器/客户端,并按预期方式运行。

服务器等待客户端,当客户端运行时,服务器完成打开并读取数据。

检查你的文件,确保你有一个实际的FIFO。

你应该看到这样的东西:

 > ls -lat /tmp/FIFO prw-r--r-- 1 user user 0 2012-09-11 10:22 /tmp/FIFO > stat /tmp/FIFO File: `/tmp/FIFO' Size: 0 Blocks: 0 IO Block: 4096 fifo Device: 6802h/26626d Inode: 186603 Links: 1 Access: (0644/prw-r--r--) Uid: (10042/ user) Gid: (10042/ user) Access: 2012-09-11 10:22:48.000000000 -0400 Modify: 2012-09-11 10:22:48.000000000 -0400 Change: 2012-09-11 10:22:48.000000000 -0400