进程间的通信方式(InterProcess Communication)有:管道、内存共享、消息队列、套接字socket、信号量、信号
*fork()一个进程,会有两次返回值,在父进程中返回子进程的PID,在子进程中返回0;
***进程是资源分配的最小单元,线程是最小的执行单元,每个进程有单独的地址空间,每个线程共享进程的地址空间和数据段。进程间的通信麻烦,切换也麻烦。线程间的通信简单但是容易对共享资源的同时访问出问题。多个进程间相互不影响,一个进程挂了并不影响另一个。多个线程间有影响,其中一个挂了就整个挂了。
1、管道:fd[1]写入、fd[0]读出
(1)分为命名管道fifo和无名管道pipe;
(2)无名管道只能用于有亲缘关系的进程间的通信,例如父子进程;
(3)而命名管道可以用于没有亲缘关系间的进程通信,文件的形式,有点像对文件的读写操作;
(4)他们都是半双工的通信方式,单向无格式字节流的传输,所以两个进程间要相互进行通信就必须建立两条管道
(5)通过内核缓冲区实现数据传输的。先进先出,读出数据后就会清除对应的内存
(6)若要数据流从父进程流向子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可以使数据流从子进程流向父进程。这有点可以理解为有一条管道,进程1从进程1的fd[1]放水进管道,水经过管道后从进程1的fd[0]流回。同理进程2也有对应的fd[1]和fd[0]对管道的操作。如果堵住进程1的fd[0]和进程2的fd[1],那么水就会从进程1的fd[1]流到进程2的fd[0]了。
2、共享内存
(1)开辟一个存储区,该存储区可以被多个进程映射到自身的地址空间中
(2)效率高只需拷贝2次,不像管道需要在内核和用户之间进行4次拷贝
3、消息队列
(1)是一个消息链接表,保存在内核中
(2)可以读写指定类型的数据,不必都只能从头读到尾
4、信号量
信号量一般用于进程间对共享资源的访问控制
5、信号SINAL
信号的捕获和处理,给不在运行状态的进程也可发信号,信号会先交由内核保存,
6、套接字
支持两个不同主机上的进程进行IPC
参考博客:进程间的5种通信方式介绍