Linux 进程间通信

1、管道

     管道是进程通信用的共享内存的一部分,在逻辑上可以看作是管道文件,在物理上由文件系统的高速缓冲区构成。有两种用于双向通信的管道:匿名管道和命名管道。前者使得有亲属关系的进程能传递信息,一般常用来重定向子进程的标准输入或输出,这样子进程就可以与其父进程交换数据。为了能双向通信,必须创建两个匿名管道。父进程使用管道的写句柄写入数据到第一个管道,而子进程使用管道的读句柄从第一个管道中读出数据。类似地,子进程写入数据到第二个管道,而父进程从第二个管道读取数据。匿名管道不能在网络中使用,也不能在彼此无关的进程间使用。不同的进程不能共享一个管道,除非他们有共同的祖先进程。

     命名管道用来在彼此间无关的进程和不同计算机上的进程之间传输数据。一般地,命名管道服务器进程使用一个众所周知的名称或能通知给各个客户端的名称来创建一个命名管道。命名管道客户进程只要知道服务器创建的管道的名称就可以打开这个管道的另一端。当服务器和客户都连接到管道上后,他们就可以通过对管道的读写来交换数据。
    命名管道的索引文件名存在于文件系统中。

     管道是先进先出的通讯方式。
   
2、消息队列

     消息队列与管道类似。首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据。如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,所以能避免使用管道的打开与关闭的同步问题。

    消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。但与管道类似,在每一个数据块上有一个最大尺寸限制,同时在系统中所有消息队列上的块尺寸上也有一个最大尺寸限制,而且没有解决使用管道遇到的阻塞问题。

3、信号量
 

    信号量(semaphore)是一个计数器,用户多进程对共享数据对象的访问,也就是用户管理对资源的访问。

    为了获得共享资源,进程需要执行下列操作。

    1). 测试控制该资源的信号量;
    2). 若此信号量的值为正,则进程可以使用该资源。进程将信号量减一,表示它使用了一个资源单位。
    3). 若此信号量的值为0,则进程进入休眠状态,直至信号量值大于0。进程被唤醒后,它返回至第一步。

当进程不再使用由一个信号量控制的共享资源时,该信号量值增一。如果有进程正在休眠等待此信号量,则唤醒它们。

4、共享内存

     共享内存可以被描述成内存一个区域(段)的映射,这个区域可以被更多的进程所共享。这是IPC机制中最快的一种形式,因为它不需要中间环节,而是把信息直接从一个内存段映射到调用进程的地址空间。 一个段可以直接由一个进程创建,随后,可以有任意多的进程对其读和写。但是,一旦内存被共享之后,对共享内存的访问同步需要由其他 IPC 机制,例如信号量来实现。  


5、信号

 

     信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。


6、套接字

原文地址:https://www.cnblogs.com/children/p/2548222.html