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) 等 )(附代码)

简述Linux进程间通信之管道pipe(下)

PHP下操作Linux消息队列完成进程间通信的方法

linux下,采用消息队列实现进程通信 (待续)

7Linux下进程间通信方式?