进程间通信

一、目的:一个大型应用系统往往需要多个助手联合作用,这些助手就是进程,他们之间通信的重要性显而易见。

主要目的有四种:数据传输,资源共享,通知事件,进程控制

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对管道进行修改。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值