0%

进程间通信方式之FIFO

FIFO,也称为命名管道,它是一种文件类型,其通信方式类似于在进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道的特性。

一、概念

      FIFO,也称为命名管道,它是一种文件类型,其通信方式类似于在进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道的特性。在数据读取时,FIFO管道中同时清除数据,并且遵循“先进先出”原则。

  1. 特点
    • 除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信
    • FIFO可以在无关的进程之间交换数据,与无名管道不同
    • FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中

二、实现

  1. write_fifo.c,写fifo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h> //FIFO库
#include<time.h>
#include <unistd.h>

int main()
{
int fd;
int n, i;
char buf[1024];
time_t tp;

printf("I am %d process.\n", getpid()); // 说明进程ID

if((fd = open("fifo1", O_WRONLY)) < 0) // 以写打开一个FIFO
{
perror("Open FIFO Failed");
exit(1);
}

for(i=0; i<10; ++i)
{
time(&tp); // 取系统当前时间
n=sprintf(buf,"Process %d's time is %s",getpid(),ctime(&tp));
printf("Send message: %s", buf); // 打印
if(write(fd, buf, n+1) < 0) // 写入到FIFO中
{
perror("Write FIFO Failed");
close(fd);
exit(1);
}
sleep(1); // 休眠1秒
}

close(fd); // 关闭FIFO文件
return 0;
}
  1. read_fifo.c,读fifo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/stat.h>
#include <unistd.h> // for close

int main()
{
int fd;
int len;
char buf[1024];

if(mkfifo("fifo1", 0666) < 0 && errno!=EEXIST) // 创建FIFO管道
perror("Create FIFO Failed");

if((fd = open("fifo1", O_RDONLY)) < 0) // 以读打开FIFO
{
perror("Open FIFO Failed");
exit(1);
}

while((len = read(fd, buf, 1024)) > 0) // 读取FIFO管道
printf("Read message: %s", buf);

close(fd); // 关闭FIFO文件
return 0;
}
  1. 运行
    • 分别运行两个c文件 gcc write_fifo.c -o write.out/gcc read_fifo.c -o read.out
    • 分别执行两个可执行文件 write.out/read.out