对于7种进程通信方式做综合比较。
1、无名管道:使用fd[2]表示管道建立后创建的两个文件描述符,可以直接操作这两个文件描述符实现无名管道的读写。其中
fd[0]用于读管道(管道头部),fd[1]用于写管道(管道尾部)。
使用注意事项:1、只适用于血缘进程即父子进程。
2、数据流单向性。读管道fd[0]时,关闭写管道fd[1];写管道fd[1]时,关闭读管道fd[0];
2、有名管道:适用任意进程间通信。如何实现的?因为创建有名管道int mkfifo(const char *pathname ,mode_t mode) 时,创建pathname对应路径下文件,任意进程都可以访问文件即实现进程通信。
3、信号处理:主要用于信号通知,信号类型必须是系统支持的命令。
进程用kill函数将信号发送给另一个进程;
信号的处理方式:1、忽略信号 2、执行用户希望动作 3、执行系统默认动作
4、共享内存:在物理内存开辟一段内存区,作为共享区域。任意进程访问该段共享内存区步骤:
(1) 创建共享内存 使用shmget函数,返回共享内存标识符shmid。
(2) 映射共享内存 将这段创建的共享映射到具体的进程空间去,使用shmat函数。
完成上述两步,进程可以对标识符shmid的共享内存访问了
5、消息队列:就是一个消息的链表。可以把消息看做一个记录,具有特定的格式。进程可以向其中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。
消息格式:
Struct msgbuf
{
long mtype; //消息类型>0
char mtext[1]; //消息数据的首地址
}
6、信号量:主要用于控制进程(执行顺序等)
7、socket