进程间通信
一、目的:一个大型应用系统往往需要多个助手联合作用,这些助手就是进程,他们之间通信的重要性显而易见。
主要目的有四种:数据传输,资源共享,通知事件,进程控制
1.数据传输:就是一般的理解,一个进程把自己的数据发给另外一个进程。
2.资源共享:多个进程想要操作共享数据,一个进程对共享数据的修改,其他进程应该能够立刻看到
3.通知事件:一个进程要向另一个或者一组进程发送消息,告诉他们发生了什么事件。比如进程中止时通知父进程
4.进程控制:有些进程希望能够完全控制另一个进程的执行,比如debug进程,此时控制进程希望能够拦截另一个进程的所有操作,并且能够及时知道他的状态改变。
二、类型:主要有五种类型:管道通信,信号通信,共享内存,消息队列,信号量
1.管道通信:利用“管道”将进程的输入和输出连接起来,输入端向管道中写入,输出端在管道的另一端接收数据。
值得注意的是,管道是先进先出的,并且是单向的。
这个“管道”是存在于内核中的
如果管道是空的,则想要读取数据的进程会发生阻塞
如果管道是满的,则想要输入数据的进程会发生阻塞
管道类型:分为有名管道和无名管道、
有名管道主要是用于运行于同一系统的任意两个进程间
无名管道主要是用于父子进程间的通信
(1)无名管道的建立:
#include <unistd.h>
if(-1== pipe(int filedis[2]))
{
perror("pipe");
}
当一个管道建立的时候会创建两个文件描述符,其中filedis[0]用于读管道,filedis[1]负责写管道
既然无名管道是负责父子进程间的通信,那么当调用fork()时,一定要先调用pipe(),不然子进程无法复制父进程的文件描述符
当fork出子进程的时候是有两个文件描述符负责写,还有两个文件描述符负责读,等到父进程关闭了用于读的fd[0],子进程将关闭相应的写文件描述符fd[1],这样无名管道就实现了父进程写子进程读的无名管道的通信
linux下一切皆文件,对于无名管道,也可以用文件的操作read,write,close对管道进行修改。