linux之进程间五种方式的对比

1.管道( pipe ):
管道:分为有名和无名管道。
有名管道:可以发生在任意2个进程之间。通过mkfifo系统命令或者mkfifo()系统调用来创建出来一个供2个进程进行数据通信的管道。
对管道的访问类似于对文件的访问。也是调用系统函数open,read,write,close来管理管道。
无名管道:只可以发生在父子进程间。通过调用pipe来创建读端和写端。Fd[0]是读端,fd[1]是写端。
在管道中有两端,一端是读端,一端是写端。
读:当管道为空时,读端就会阻塞,当写端关闭时,读端会解除阻塞并且返回值是0.
写:当管道为满时,写端就会阻塞,当读端关闭的时候,写端会自己产生一个SIGPIPE信号终止自己。
管道内部也是原子操作。并且管道文件是在磁盘上,而给管道写入数据都是往内存写入,因此管道文件大小一直都是0。管道是属于半双工(同一时刻只能进行一种操作,要不读,要不写)的方式工作。采用的是先进先出的顺序。


2.消息队列( message queue ) :
消息队列和有名管道有很多相似之处,但不需要去打开和关闭管道。
它允许允许一个或者多个进程向他写入与读取消息。
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。
Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度。
消息队列可实现消息的随机查询,不一定要以先进先出的顺序读取,也可以按照类型进行读取。
msgget(): 用来创建或访问一个消息队列;
msgsnd(): 用来把消息添加到消息队列中;
msgrcv(): 从一个消息队列中获取消息;
msgctl(): 作用与共享内存的控制函数相似;


3.共享内存( shared memory ):
共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程.
映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
shmget(): 创建共享内存;
shmat(): 启用对第一个创建的共享内存的访问;
shmdt(): 将共享内存从当前进程中分离;
shmctl(): 共享内存的控制函数;


4.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。


5.套接字( socket ) : 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

猜你喜欢

转载自blog.csdn.net/qq_39110766/article/details/81209417