我有两个进程,一个服务器和一个客户端,应该通过管道(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);
Run Code Online (Sandbox Code Playgroud)
它永远不会到达“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);
Run Code Online (Sandbox Code Playgroud)
编辑
我没有提到线路
#define FIFO_NAME "MYFIFO"
...这就是问题所在:正如乔迪·哈金斯所说,路径是相对的,并且进程从不同的文件夹启动,他们试图打开不同的文件。
在写端完成管道之前,读端不会完成阻塞打开。
如果您不想要此功能,则打开读取端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
Run Code Online (Sandbox Code Playgroud)