试图打开管道进行读取时的open()块(open() blocks when trying to o

2019-07-31 12:05发布

余有两个过程,服务器和一个客户端,这应该通过管道(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"

...这里是问题:作为乔迪Hagins说,该路径是相对的一个,并从不同的文件夹被启动的进程,他们试图打开不同的文件。

Answer 1:

读取端将无法完成阻塞开到写入端已经完成了管道。

如果你不想要这个功能,然后打开读侧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


文章来源: open() blocks when trying to open pipe for reading
标签: c++ linux pipe