c - 并非所有写入 FIFO 的消息都在读取时收到

标签 c linux mkfifo

我在 linux 下用 C 语言处理 fifo 文件时遇到了一个奇怪的问题。

让我们从代码开始:

#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>

int main(int args, char *argv[])
{
mkfifo("fif",0666);
int x = fork();

if(x!=0)
{
     if(strcmp(argv[1],"read")==0)
     {
     int rea=open("fif",O_RDONLY,0666);
     wait(NULL);
     char buf[50];
     read(rea,buf,50);
     printf("\n %s \n",buf);
     close(rea);
     }
}

else
{
     if(strcmp(argv[1],"write")==0)
     {
     int wri=open("fif",O_WRONLY,0666);
     write(wri,argv[2],strlen(argv[2])+1);
     close(wri);
     }
}



return 0;
}

现在详细说明我希望代码做什么。

像这样运行程序后:

./prog write hello
./prog write how
./prog write are_you
./prog read

我想在终端:

hello
how
are_you

但是我得到的不是这个,而是这个:

are_you

问题是:我想向 FIFO 写入几条消息,然后通过读取 FIFO 来接收存储在其中的整个文本。但不幸的是,只有最后一条消息被存储/写入标准输出(在本例中为终端),就像执行的唯一命令是:

./prog write are_you

我试图删除这一行:

mkfifo("fif",0666);

因为我想,如果 FIFO 文件已经存在,这一行可以创建并覆盖现有的 FIFO 文件。但这并没有改变任何东西。

那么我必须做些什么才能使其按预期工作?

最佳答案

首先,请注意您正在将终止符 \0 写入 FIFO:

 write(wri,argv[2],strlen(argv[2])+1);

当您读取 fifo 的内容时,您也读取了 \0 字符,并将数据传递给 printf。问题是,printf 在找到第一个 \0 时停止读取字符串,因此您只会看到来自 fifo 的第一条消息。

如果你在strace下运行读取程序,你可以清楚地看到这一点:

read(3, "are_you\0hello\0how\0", 50)    = 18
...(snip)...
write(1, " are_you \n", 10)             = 10

关于c - 并非所有写入 FIFO 的消息都在读取时收到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26866058/

相关文章:

c++ - opengl中对象的旋转

c - 具有多个客户端 C/unix 的简单 TCP 服务器

c++ - 如何调试 win 32 进程以查找内存访问冲突?

linux - 无法编译qc-usb驱动?

linux -/sys/bus/pci/device/0000 :xx:xx. x/resource下的资源文件包含什么信息?

javascript - 为什么在 Node 中打开 fifo 管道会阻止 child_process.exec?

Bash 脚本语句

c++ - 计算立方体/长方体的边界框/缺失点

regex - 发出运行 sed 以替换文件中的字符串

c - 等到 2 pid 写入 FIFO(命名管道)