目录
前言
进程间通信的目的:
1、数据传输:一个进程需要将它的数据发送给另一个进程
2、资源共享:多个进程之间共享同样的资源
3、通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)
4、 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常
进程间通信:IPC(InterProcess Communication)
IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等,其中Socket和Streams支持不同主机上的两个进程IPC。
一、管道
管道,通常指无名管道,是UNIX系统IPC最古老的形式
特点:
1、半双工(即数据只能在一个方向流动),具有固定的读端和写端
2、只用于父子进程和兄弟进程之间通信
3、可看成一种特殊的文件,对于它的读写可以使用普通的read、write函数,但它不是普通文件,并不属于任何文件系统,并只存在内存中
4、同一时间,数据只能是单向的,一边读一边写
5、管道的数据,读走就没
(1)无名管道
NAME
pipe, pipe2 - create pipe
SYNOPSIS
#include <unistd.h>
int pipe(int pipefd[2]);
##int pipefd[2] 定义一个两个元素的数组
代码实现:
#include<stdio.h>
#include <unistd.h>
#include<string.h>
#include <stdlib.h>
int main ()
{
int fd[2];
int pid;
char readBuf[128]={0};
if(pipe(fd)==-1){
printf("creat pipe fail\n");
}
pid=fork();
if(pid<0){
printf("creat fail\n");
}else if(pid>0){//进入父进程
sleep(1);
printf("this is father\n");
close(fd[0]);//关闭读端
write(fd[1],"hello helloo",strlen("hello helloo"));//把数据写入管道
}else{//进入子进程
printf("this is child\n");
close(fd[1]);//关闭写端
read(fd[0],readBuf,128);//读取缓冲区数据
printf("%s\n",readBuf);//输出数据
}
return 0;
}
执行成功。
(2)命名管道
FIFO,也称为