Linux 进程间通信知识点总结
进程间通信(IPC)是指在不同进程之间传播或交换信息。
进程间通信的方式主要有以下6钟:
(1)管道(Pipe)
(2)信号(Singal)
(3)信号量(Semaphore)
(4)共享内存(shared memory)
(5)消息队列(Message Queue)
(6)套接字(Socket)
下面对6种方式进行详细介绍:
管道
1、管道分为有名管道和无名管道,通常指无名管道。
2、无名管道特点:
(1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
(2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
(3)对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
3、缺点:速度慢,容量有限,只有父子进程能通讯。
4、管道的创建及使用:
调用pipe()函数创建一个管道,再通过fork()函数创建一个子进程,该子进程继承父进程所创建的管道,为实现父子进程间的读写,只需把无关的读端或写端的文件描述符关闭即可。若要数据流从父进程流向子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可以使数据流从子进程流向父进程。
5、父子进程在运行时,先后顺序并不能保证。可以在进程中添加sleep()函数。
6、标流管道:管道的操作也支持基于文件流的模式,这种基于文件流的管道主要是用来创建一个连接到另一个进程的管道,这里的“另一个进程”也就是一个可以进行一定操作的可执行文件。
7、因此标准流管道就将一系列的创建过程合并到一个函数popen()中完成。它所完成的工作有以下几步:
(1)创建一个管道
(2)fork()一个子进程
(3)在父进程中关闭不必要的文件描述符
(4)执行exec函数族调用
(5)执行函数中所指定的命令
8、popen()函数的使用减少了代码的编写量,但是灵活性不如pipe()函数所创建的管道,并且使用popen()创建的管道必须使用标准I/O函数进行操作,但不能使用read()、write()一类不