C语言 POSIX FIFO 在阻塞模式下打开时冻结



默认情况下,POSIX FIFO以阻塞模式打开。 我的问题是,当我在阻止模式下打开它时,它只是冻结(阻止(,没有其他任何事情发生。

最初我用 RDWR 标志打开了两面,我没有问题,因为 RDWR 使其非阻塞,因为"在 Linux 下,打开 FIFO 进行读取和写入将在阻塞和非阻塞模式下成功"(https://linux.die.net/man/7/fifo(。 但是在非阻塞模式下,我有时会删除记录,所以我需要在阻塞模式下打开它。

以下是我对 mkfifo 的称呼

int64_t fifo_setup(char * fifo_name)
{
if (mkfifo(fifo_name, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH) == -1) {
perror("mkfifo");
exit(EXIT_FAILURE); }
return 0; }

我原来的电话打开:

int64_t fifo_open(char * fifo_name, int64_t read_write) {
int c;
if (read_write == 1) { 
c = open(fifo_name, O_RDWR);}
if (read_write == 2) { 
c = open(fifo_name, O_RDWR);}
perror("open");
return (c);
}

然后我把它改成:

int64_t fifo_open(char * fifo_name, int64_t read_write) {
int c;
if (read_write == 1) { 
c = open(fifo_name, O_WRONLY);}
if (read_write == 2) { 
c = open(fifo_name, O_RDONLY);}
perror("open");
return (c);
}

我的程序到达了编写器线程的公开调用(这是对 C 的 NASM 调用(:

Open_FIFO_Write:
lea rdi,[fifo_name]
mov rsi,1
call fifo_open wrt ..plt
mov [fifo_write_fd],rax

但是随后腻子终端冻结(块(,没有其他事情发生。 我从来没有到达打开阅读面的块。 具体来说,它在上面fifo_open代码中到达 perror("open"(之前阻塞:

根据 Linux 手册页 https://www.man7.org/linux/man-pages/man7/fifo.7.html,"通常,打开 FIFO 块,直到另一端也打开。 这很好,但我无法访问打开编写器的代码,因为阅读器阻止了所有进一步的进度。 这就像墨西哥的对峙。

当然一定有办法,但我的研究还没有找到。

感谢您对此的任何帮助。

三个选项:

  1. FIFO 本身不会在非阻塞模式下丢弃消息。如果代码丢弃消息,请修复代码以停止执行此操作,然后仅使用非阻塞模式。
  2. 在非阻塞模式下打开 FIFO,然后在两端打开后,使用fcntl将其更改为阻塞模式。
  3. 使用单独的线程或进程打开 FIFO 的每一部分。

最新更新