常见的进程间通信方式

管道

  • 匿名管道:没有具体的管道名称,它们之间的通信必须是有关联的父子之间的进程,比如当父进程创建了子进程,子进程就与父进程共享了这个管道

下图是父进程创建的管道,它的文件描述符表包含stdin标准输入、stdout标准输出、stderr标准错误,以及对管道的读出和写入

常见的进程间通信方式

接下来是对父进程的fork,从图中可以看出创建的子进程与父进程具有一模一样的属性和行为,但当父进程与子进程同时对管道进行读写数据时,容易发生混乱,所以应该把管道全双工通信的机制设置为半双工

常见的进程间通信方式

把管道通信设置为半双工通信后,便能保证通信的准确性

常见的进程间通信方式

  • 有名管道:对于没有关联的进程可以使用有名管道,如Unix或Linux里的socket.xxx文件

Socket

  • 普通socket
  • UnixSocket:比普通Socket更轻量

eg:fork之后的Socketpair

由于管道的全双工通信机制,在fork一个子进程后,子进程对管道的end写入数据,但是在head端能读出数据,这样便不能达到进程间通信的目的,于是便可以关掉不需要的读/写端
常见的进程间通信方式

关掉子进程的end端和父进程的head端后便可以保证父子进程之间的通信

常见的进程间通信方式

共享内存

若创建一个共享内存,则所有进程都能去访问,但需要加一把锁

信号

对信号创建一个处理函数,当别的进程捕获这个信号便能回复这个函数