进程间通信顾名思义就是进程之间的通信机制,英文简称IPC,进程见通信主要有一下几种方式:
信号(signal):亲缘进程和非亲缘进程都可以, 也可以进程自己给自己递送信号。
信号量(semaphore):主要是线程间和亲缘进程间的同步手段,不做数据传输之用。
命名信号量:可以在非亲缘进程间使用。
管道:只允许亲缘进程间的通讯。
命名管道(FIFO):除了亲缘进程可以通讯外,非亲缘进程也可以通讯。
共享内存:多个进程可以访问同一块内存空间,是最快的IPC方式。在进程间传递数据时无须任何内存的拷贝 。
套接字:最通用的进程间通讯方式,它提供了一种让不同机器上进程间通讯方式。
1.管道
管道是半双工的,当需要双向通讯时,需要两个管道。只能用于父子进程和兄弟进程等有亲缘关系的进程。数据写入时,放在管道的结尾。
#include <unistd.h>
int pipe(int pipefd[2]);
pipe用来创建一个管道,这个管道用于父子进程间的通讯。pipefd[0]是管道的读端,pipefd[1]是管道的写端。由于管道是单向的,所有一个进程需要关闭写端或者读端。写端不存在时,读端会收到文件结束符。读端不存在时,写端会收到SIGPIPE信号。成功返回0,失败返回-1.
缺点:只能用于亲缘进程间通讯。数据读取时,从管道的头开始读取。
以下是实现代码
2.命名管道(FIFO)
命名管道可以在所有进程间使用,克服了管道只能在亲缘进程通讯的限制。命名管道与一个路径名相关联,以文件的形式存在于文件系统中。只要能访问该文件的进程就可以使用命名管道。命名管道也是先进先出,虽然以文件形式实现单不支持seek等操作。
创建FIFO
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * pathname, mode_t mode)
第一个参数为路径名,第二个为创建类型。跟create函数的参数一样。进程只要打开这个文件,就可以往这个文件读和写。当多个进程往fif