Linux进程间的通信机制如下图所示:
1、同主机进程间数据交互机制:无名管道(PIPE)、有名管道(FIFO)、消息队列(Message Queue)和共享内存(Share Memory)。
2、同主机进程间同步机制:信号量(semaphore)。
3、同主机进程间异步机制:信号(Signal)。
4、网络主机间数据交互机制:套接字(Socket)。
接下来将针对上述内容,整理一下相关知识,以加深在脑海中的印象?
首先介绍无名管道(PIPE),无名管道,又称匿名管道,比较简单。
无名管道的特点:
1)、单工/半双工(单向)的,只能实现从A进程向B进程发送消息。如果想实现双向,则需要用两个管道。
2)、只能在具有亲缘关系的进程中使用,如父子进程、兄弟进程。
3)、传输的数据大小(缓冲区)受限,一般为4096字节。
4)、数据写入在管道缓冲区的末端buf[1],读出在首端buf[0]。
5)、是一种特殊的内存文件,传输完成后,管道自动消失。
6)、很明显,没有名字。
7)、传输的是无格式的字节流,使用时需双方规定好相关解析策略。
一个简单的例子:pipe.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pid_t pid;
int temp;
int pipedes[2];
char s[] = "I am Haven Zhao";
char d[sizeof(s)]; //sizeof在编译期执行,是个常量
if(pipe(pipedes) == -1)//创建管道
{
perror("pipe");
exit(EXIT_FAILURE);
}
if((pid = fork()) == -1)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if(pid == 0)//子进程
{
printf("now,write data to pipe\n");
if((write(pipedes[1], s, 16)) == -1) //写数据到管道
{
perror("write");
exit(EXIT_FAILURE);
}
else
{
printf("the written data is: %s\n");
exit(EXIT_SUCCESS);
}
}
else if(pid > 0) //父进程
{
sleep(2);//休眠2秒,让子进程先执行
printf("now,read data from pipe\n");
if((read(pipedes[0], d, 16)) == -1)
{
perror("read");
exit(EXIT_FAILURE);
}
printf("the data from pipe is: %s\n", d);
}
return 0;
}
无名管道的适用情况:
1、用于shell中。例如,使用ps aux|grep Daemon命令,查看进程列表中含有Daemon的进程。
2、用于亲缘进程间通信。上面的实例pipe.c就是。