上一篇博客已经介绍了一种进程间通信的方式,但是那只是针对于有血缘关系的进程,即父子进程间的通信,那对于没有血缘关系的进程,那要怎么通信呢?
这就要创建一个有名管道,来解决无血缘关系的进程通信, fifo:
book@ubuntu:~$ mkfifo xwp
book@ubuntu:~$ ls -l myfifo
prw-rw-r-- 1 book book 0 Feb 6 2016 myfifo
mkfifo 既有命令也有函数
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
举例:
/* fifo_write.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
void sys_err(char *str, int exitno)
{
perror(str);
exit(exitno);
}
int main(int argc,char *argv[])
{
int fd, len;
char buf[1024] = "hello world\n";
if(argc < 2)
{
printf("./app myfifo\n");
exit(1);
}
fd = open(argv[1],O_WRONLY);
if(fd < 0)
sys_err("open",1);
write(fd, buf, strlen(buf));
close(fd);
return 0;
}
/* fifo_read */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
void sys_err(char *str, int exitno)
{
perror(str);
exit(exitno);
}
int main(int argc,char *argv[])
{
int fd, len;
char buf[1024] = {0};
if(argc < 2)
{
printf("./app myfifo\n");
exit(1);
}
fd = open(argv[1],O_RDONLY);
if(fd < 0)
sys_err("open",1);
read(fd, buf, sizeof(buf));
write(STDOUT_FILENO, buf, strlen(buf));
close(fd);
return 0;
}
操作方法:
分别编译成可执行程序:fifo_write 和 fifo_read
在一个终端下输入 ./fifo_write myfifo
在另一个终端下输入 ./fifo_read myfifo
即可观察到结果
注:
- 当只写打开FIFO管道时,该FIFO没有读端打开,则open写打开会阻塞。
- FIFO内核实现时可以支持双向通信。(pipe单向通信,因为父子进程共享同一个file结构体)
- FIFO可以一个读端,多个写端;也可以一个写端,多个读端。