(1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
(2)信号(Signal) :信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。
(3)消息队列(Messge Queue) :消息队列是消息的链接表,包括 Posix 消息队列 SystemV 消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息; 对消息队列有读权限的
进程则可以从消息队列中读取消息。
(4)共享内存(Shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。
(5)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。
(6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。
一、管道
管道是 Linux 中一种很重要的通信方式, 它是把一个程序的输出直接连接到另一个程序的输入。
如:sfe1012@sfe1012-ThinkPad-Edge-E540:~$ ps -ef|grep ntp
sfe1012 7365 7262 0 22:34 pts/1 00:00:00 grep --color=auto ntp
ps -ef:将会输出所有的运行进程,作为grep的输入,ntp进程名字是ntp的服务,将会被选择出来,并且打印。
这里主要指无名管道,它具有如下特点:
它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。
它是一个半双工的通信模式,具有固定的读端和写端。
管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()和 write()等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内核的内存空间中。
管道的创建与关闭
管道是基于文件描述符的通信方式,当创建一个管道的时候,就会同时创建两个文件描述符号fd[0](用于读取管道)、fd[1](用于写管道),这样就形成了一个办双工的通道了。
要想关闭管道,只需要将这两个文件描述符号分别关闭就可以了,用close();
管道的创建函数
int pipe(int fd[2]) 头文件:unistd.h
管道应用说明
pipe()函数创建的管道两端处于一个进程中,由于管道十主要用于在不同进程间通信的,因此这在实际的应用中没有太大意义。所以通常先创建一个管道,在通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道,这时候。如图8.4所示。这样我们可以关闭父进程的fd[1](写)和子进程的fd[0](读)就形成了图8.5所示,能够实现子进程向父进程写入数据的管道的方法,同样我们也可以关闭另外的方法,实现父进程向子进程写入数据的管道方法。
273