尝试打开管道进行读取时打开()块

时间:2012-09-11 13:41:32

标签: c++ linux pipe

我有两个进程,服务器和客户端,应该通过管道(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所说,路径是一个相对的路径,而且流程是从不同的文件夹开始的,他们试图打开不同的文件。

1 个答案:

答案 0 :(得分:4)

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

如果您不想要此功能,请打开读取端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