2

我一直在尝试使用 FIFO 实现 IPC,我做了以下,它似乎工作正常,测试了几次,对我来说看起来不错。

问题是我需要注意什么,我知道读取和写入将是原子的,因为我将在 PIPE_BUF 下方写入。

我已经像这样运行它

。/作家

./读者 ./读者

我看到阅读器工作正常,例如第一个阅读器阅读 1,然后第二个阅读器阅读 2 和 3,然后第一个阅读器阅读 4,依此类推。

请注意,我在这里找到了代码并对其进行了修改。

作家.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);
    }

读者.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);
    }
4

1 回答 1

1

如果某个读取器进程处于饥饿状态,它将在read系统调用上被阻塞,写入器最终将被内核调度并写入一些东西。该PIPE_BUF限制仅对单个消息的最大大小很重要(例如,读取,您不会达到该大小)。

对称地,如果 writer 写入很多,fifo 缓冲区会变满(上图PIPE_BUF)并且write系统调用在 writer 进程中被阻塞。最终调度程序将运行阅读器。

请参见read(2)write(2)手册页。当您想要多路复用时,了解poll(2)也可能会有所帮助。另请参见fifo(7)

PIPE_BUF是对每个原子读写的限制。更大的读取和写入只能部分完成。内核保证,如果读取或写入操作可以在少于PIPE_BUF字节的情况下完成(即当这样的字节数量可用时!),它将在管道和相关文件描述符(例如 FIFO)上整体完成。

阅读高级 unix 编程和/或高级 linux 编程书籍

于 2012-08-04T05:33:31.283 回答