Linux下进程间通信
Posted 四季帆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下进程间通信相关的知识,希望对你有一定的参考价值。
1. 管道(pipe)
管道是由内核管理的一个环形缓冲区,两个进程分别连接到管道的两端,一个进程负责往管道写入信息,管道另一端的进程负责读取管道中的信息。
当管道中没有信息时,从管道中读取的进程会等待,直到另一端的进程写入信息;当管道被放满信息时,尝试放入信息的进程会等待,直到另一端的进程取出信息。
当两个进程都终结时,管道也会自动消失。
注意:管道只能在本地计算机中使用,而不可用于网络间的通信。
#include <unistd.h>
int pipe(int file_descriptor[2]);//建立管道,该函数在数组上填上两个新的文件描述符后返回0,失败返回-1。
eg.int fd[2]
int result = pipe(fd);
2. 命名管道
在管道的现有功能上,克服了管道没有名字的限制,因此,它允许无亲缘关系的进程间进行通信。
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *filename,mode_t mode); //建立一个名字为filename的命名管道,参数mode为该文件的权限(mode%~umask),若成功则返回0,否则返回-1,错误原因存于errno中。
eg.mkfifo( "/tmp/cmd_pipe", S_IFIFO | 0666 );
3. 信号(signal)
用于通知接受进程有某种事件发生。
4. 信号量(semaphore)
信号量是特殊的变量,它只取正整数值并且只允许对这个值进行两种操作,P、V操作,P用于等待,V用于信号。
5.消息队列(message)
消息队列的本质是由内核维护的一个链表,在各个进程之间直接传递内容。msgget创建一个新队列或打开一个存在的队列;msgsnd向队列末端添加一条新消息;msgrcv从队列中取消息。
消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
6.套接字(socket)
套接字机制不但可以在单机的不同进程通信,而且使得跨网机器间进程可以通信。
套接字的创建和使用与管道是有区别的,套接字明确地将客户端和服务端区分开来,可以实现多个客户端连到同一服务器。
以上是关于Linux下进程间通信的主要内容,如果未能解决你的问题,请参考以下文章
linux 进程间通信 dbus-glib实例详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)
linux 进程间通信 dbus-glib实例详解三(下) 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象object) 等 )(附代码)