IPC在Linux下使用FIFO

时间:2012-08-04 02:10:47

标签: c linux

我一直在尝试使用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);
    }

1 个答案:

答案 0 :(得分:1)

如果某些读者进程被饿死,它将在read系统调用上被阻止,并且编写器最终会被内核调度并写入一些内容。 PIPE_BUF限制仅适用于单个邮件的最大尺寸(例如,读取,您将无法达到该尺寸)。

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

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

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

阅读advanced unix programming和/或advanced linux programming本书