进程间通信方式一共六种:
无名管道,有名管道,信号,消息队列,共享内存,信号量。
接下来,咱们理解一下!
进程间通信的目的:
数据传输:一个进程需要将它的数据发送给另一个进程;
资源共享:多个进程之间共享同样的资源;
通知事件:一个进程需要向另一个进程发送消息,通知其发生了某种事情(比如进程终止父进程告诉子进程);
进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,能够及时知道它的状态改变。
一、继承了Unix传统的通信方式
1.无名管道
1.只能用于具有亲缘关系(父子进程/兄弟进程)的进程之间的通信,速度慢,容量有限;
2.半双工的通信方式,具有固定的读端fd[0]和写端fd[1];
3.管道可以看成一种特殊的文件,对于它的读写我们实用文件IO中read和write。
2.有名管道
1.有名管道是对无名管道的改进,它可以使互不相关的两个进程互相通信,并且在文件系统中可见,可以通过文件名来找到;
2.半双工的通信方式,进程通过文件IO来操作有名管道;
3.有名管道遵循先进先出原则,不支持lseek()。
3.信号
信号是一种异步通信方式。
信号产生的方式:
1.硬件产生(组合键)信号
ctrl+c SIGINT
ctrl+z SIGTSTP
ctrl+\ SIGQUIT
2.内核发送信号
alarm()也称为闹钟函数,它可以在进程中设置一个定时器。当定时器指定的时间到时,内核就向进程发送SIGALRM信号;
pause()函数是用于将调用进程挂起直到收到信号为止。
3.软件方式产生信号
raise() 自己给自己发送信号;
kill() 给别人发送信号。
二、systemV进程间通信方式
消息队列
1.消息队列由消息队列ID来唯一标识;
2.消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等;
3.消息队列可以按照类型来发送/接收消息,相同类型先入先出,不同类型随意存取;
4.全双工的一个通信方式。
共享内存
1.共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝;
2.为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间;
3.进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率;
4.由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等。
信号量
信号量不能传送数据,一般和共享内存配合使用,实现共享内存同步。