以非阻塞方式打开FIFO(命名管道)以进行只写操作是否可行?

huangapple go评论51阅读模式
英文:

Is there a way to open FIFO(named pipe) in write-only way without blocked

问题

I use FIFO in my server. Due to some limitations, I have to open the FIFO in write-only firstly, then I use fork to create another process to open FIFO in read-only. But I find that, it will be blocked when I open the FIFO in write-only firstly, thus the server can not continue to run to fork.

由于某些限制,我必须首先以只写模式打开 FIFO,然后使用 fork 创建另一个进程以只读模式打开 FIFO。但我发现当我首先以只写模式打开 FIFO 时,它会被阻塞,因此服务器无法继续运行到 fork

For some reason I can not open FIFO in read-only firstly, Is there a way to open FIFO in write-only without blocked? I have tried open("/tmp/ngfifo", O_WRONLY | O_NONBLOCK) but will return error.

由于某些原因,我不能首先以只读模式打开 FIFO,有没有办法以只写模式打开 FIFO 而不被阻塞?我已经尝试过 open("/tmp/ngfifo", O_WRONLY | O_NONBLOCK),但会返回错误。

The small example is like this :

示例代码如下:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>

int main()
{
    int pipe_fd = open("/tmp/ngfifo", O_WRONLY);  // It will be blocked here, is there a way to open without block.
    if (pipe_fd < 0) {
        fprintf(stderr, "Opened fifo failed %d\n", errno);
        return -1;
    }
    printf("wait..\n");

    if (fork() > 0) {
        printf("begin to write \n");
    } else {
        int read_fd = open("/tmp/ngfifo", O_RDONLY);
        // ...
        printf("begin to read \n");
    }
    return 0;
}
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>

int main()
{
    int pipe_fd = open("/tmp/ngfifo", O_WRONLY);  // 会在这里被阻塞,是否有办法在不阻塞的情况下打开。
    if (pipe_fd < 0) {
        fprintf(stderr, "打开FIFO失败 %d\n", errno);
        return -1;
    }
    printf("等待..\n");

    if (fork() > 0) {
        printf("开始写入\n");
    } else {
        int read_fd = open("/tmp/ngfifo", O_RDONLY);
        // ...
        printf("开始读取\n");
    }
    return 0;
}
英文:

I use FIFO in my server. Due to some limitations, I have to open the FIFO in write-only firstly, then I use fork to create another process to open FIFO in read-only. But I find that, it will be blocked when I open the FIFO in write-only firstly, thus the server can not continue to run to fork.

For some reason I can not open FIFO in read-only firstly, Is there a way to open FIFO in write-only without blocked? I have tried open(&quot;/tmp/ngfifo&quot;, O_WRONLY | O_NONBLOCK) but will return error

The small example is like this :

#include &lt;fcntl.h&gt;
#include &lt;stdio.h&gt;
#include &lt;unistd.h&gt;
#include &lt;errno.h&gt;
#include &lt;sys/types.h&gt;

int main()
{
    int pipe_fd = open(&quot;/tmp/ngfifo&quot;, O_WRONLY);  // It will be blocked here, is there a way to open without block.
    if(pipe_fd &lt; 0) {
        fprintf(stderr, &quot;Opened fifo failed %d\n&quot;, errno);
        return -1;
    }
    printf(&quot;wait..\n&quot;);

    if (fork() &gt; 0) {
        printf(&quot;begin to write \n&quot;);
    } else {
        int read_fd = open(&quot;/tmp/ngfifo&quot;, O_RDONLY);
        // ...
        printf(&quot;begin to read \n&quot;);
    }
    return 0;
}

答案1

得分: 3

通常情况下,打开 FIFO 会阻塞,直到另一端也被打开。

解决方法很简单:在分叉(fork)子进程之后再打开文件。

英文:

From the FIFO manual page:

> Normally, opening the FIFO blocks until the other end is opened also.

The solution is simple: Open the file after you have forked your child process.

答案2

得分: 1

Linux FIFO手册页面

在Linux下,以读写方式打开FIFO将在阻塞模式和非阻塞模式下均成功。POSIX未定义此行为。这可用于在没有可用读取器的情况下打开FIFO进行写入。

因此,在Linux上,写入进程可以调用open("/tmp/ngfifo", O_RDWR | O_NONBLOCK)以非阻塞方式打开管道的写入端,因为它也用于读取。然而,这在其他操作系统上不具备可移植性。

英文:

From the Linux FIFO man page:

> Under Linux, opening a FIFO for read and write will succeed both in blocking and nonblocking mode. POSIX leaves this behavior undefined. This can be used to open a FIFO for writing while there are no readers available.

So on Linux, it is possible for the writing process to call open(&quot;/tmp/ngfifo&quot;, O_RDWR | O_NONBLOCK) to open the write end of the pipe without blocking because it is also open for reading. However, this is not portable to other operating systems.

huangapple
  • 本文由 发表于 2023年6月6日 14:31:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/76411975.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定