我一直在尝试使用FIFO实现IPC,我已经做了以下工作,它似乎工作正常,经过几次测试,对我来说看起来不错。
问题是我需要注意什么,我知道读写将是原子的,因为我将在PIPE_BUF下方写作。
我像这样运行它
./作家
./读者 ./reader
我看到读者工作正常,例如第一个读取器读取1然后第二个读取器读取2和3然后第一个读取器读取4,依此类推。
请注意我在here中找到了代码并对其进行了修改。
writer.c
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
int main()
{
int fd,fd1;
fd=open("fifo1",O_WRONLY);
int data = 1;
while (1){
write(fd,&data,sizeof(int));
usleep(10);
data++;
}
//printf("File Content :%s",s1);
}
reader.c
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
int main()
{
int fd,fname;
mkfifo("fifo1",0600);
fd=open("fifo1",O_RDONLY);
int d = 0;
while(read(fd,&d,sizeof(int))!=0)
{
printf("%d\n",d);
usleep(10);
}
close(fd);
}
答案 0 :(得分:1)
如果某些读者进程被饿死,它将在read
系统调用上被阻止,并且编写器最终会被内核调度并写入一些内容。 PIPE_BUF
限制仅适用于单个邮件的最大尺寸(例如,读取,您将无法达到该尺寸)。
对称地,如果writer写了很多,则fifo缓冲区变满(在PIPE_BUF
之上)并且在编写器进程中阻塞了write
系统调用。最终调度程序将运行阅读器。
请参阅read(2)和write(2)手册页。当您想要多路复用时,了解poll(2)也会有所帮助。另请参阅fifo(7)。
PIPE_BUF
是每个原子读写的限制。更大的读写只能部分完成。内核保证如果读取或写入操作可以在少于PIPE_BUF
个字节的情况下实现(即,当这样的字节数量可用时!),它将在整个管道和相关文件描述符(例如,FIFO)上完成。 )。