【发布时间】:2012-09-04 11:09:17
【问题描述】:
我有两个进程,一个服务器和一个客户端,它们应该通过管道(C++、Linux)进行通信。
服务器使用O_RDONLY 标志打开管道,客户端使用O_WRONLY 打开管道。
但是,服务器在 open 函数处阻塞,而客户端似乎运行成功(open 函数返回成功,write 函数也是如此)。
我已经读到如果设置了O_NONBLOCK 标志,读取功能将继续,但如果没有客户端连接,我不希望它继续 - 可以阻止 直到客户端连接,但在我的情况下,即使在客户端完成运行后它仍然被阻止......
你能告诉我我做错了什么吗...?
代码如下:
// 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 所说,路径是相对路径,进程从不同文件夹启动,他们试图打开不同的文件。
【问题讨论】:
-
客户端连接后是否会不小心重新创建了 FIFO?
-
在调试期间,我等待服务器到达“打开”行,点击继续,然后运行客户端......所以我相信不会......
-
你有没有检查过文件实际上是由
mkfifo创建的? -
不是也需要在客户端创建FIFO吗?
-
@tetsuo000 不,我不这么认为...客户端应该能够通过其名称打开管道。