一、常用的进程间通信方式
1、传统的进程间通信方式
1.1、无名管道pipe
1.2、有名管道fifo
1.3、信号signal
2、system v ipc 对象
2.1、共享内存share memory
2.2、消息队列message queue
2.3、信号灯semaphore
3、BSD
3.1、套接字socket
1.1、无名管道pipe
只能用于具有亲缘关系的进程之间的通信;
半双共通信模式,具有固定的读端和写端;
管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。
管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。
当管道中无数据时,读操作会阻塞。管道读写创建进程来实现。
1.2、有名管道可以使互不相关的两个进程互相通信,进程通过文件IO来操作有名管道,有名管道遵循先进先出规则,不支持lseek()操作。有名管道用mkfifo函数创建。
1.3、信号signal通信。信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互。信号的生存周期,忽略信号、捕捉信号、执行缺省操作。
信号的使用场合。后台进程需要使用信号;如果两个进程没有亲缘关系,无法使用无名管道;如果两个通信进程之一只能使用标准输入和标准输出,则无法使用有名管道。
信号处理的主要方法。使用简单的signal函数;使用信号集函数。
2.1、共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,不需要任何数据的拷贝;为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间;由于多个进程共享一段内存,因此存在竞态。
创建/打开共享内存shmget函数
映射共享内存shmat函数
撤销共享内存映射shmdt函数
删除共享内存对象shmctl函数
2.2、消息队列由消息队列ID来唯一标识;消息队列就是一个消息的列表,用户可以在消息队列中添加消息、读取消息;消息队列可以按照类型来发送接收消息。
2.3、信号灯也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制。二值信号灯与互次锁相似资源可用时值为1,资源不可用时值为0;计数信号灯用来统计资源;等待操作是等待信号灯的值变为大于0,然后将其减一;而释放操作则相反,用来唤醒等待资源的进程或者线程。
System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。System V信号灯由内核维护。
信号灯用在共享内存中。
进程间通讯方式比较:
无名管道pipe具有亲缘关系的进程间,单工,数据在内存中
有名管道fifo可用于任意进程间,双工,有文件名,数据在内存中
信号signal唯一的异步通信方式
消息队列msg常用于cs模式中,按消息类型访问,可有优先级
共享内存shm效率最高直接访问内存,需要同步、互次机制
信号灯sem配合共享内存使用,用以实现同步和互次