Linux进程间通信方式主要有 管道、信号、消息队列、共享内存、信号量 和 套接字
一、管道
1、无名管道的特点:
1)只能用于具有亲缘关系的进程之间的通信
2)是一个半双工的通信模式,有固定的读端和写端
3)管道可以看做是一个特殊的文件,可以使用普通的read()、write()等函数,但其不属于任何文件系统,并只存在内存中
2、命名管道(FIFO)
1)使两个互不相关的进程实现通信
2)该管道可以通过路径名指出,并且在文件系统中是可见的,可以像普通文件一样进行读写操作
3)FIFO严格遵守先进先出规则,对管道的读总是从开始处返回数据,对它们的写总是添加到末尾,不支持lseek()文件定位
判断命名管道是否创建成功,通常采用乳下的方式:
if((mkfifo(MYFIFO,0666)<0)&&(errno!=EEXIST))
{
}
EEXIST表示该文件已经存在。
二、信号通信
信号是在软件层次上对终端机制的一种模拟,在院里上一个进程收到一个信号与处理器收到一个中断请求时一样的。信号是异步的,一个进程不知道信号何时会到来,信号可以直接进行用户空间和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。
进程一般通过3种方式来响应信号:
1)忽略信号,但有两个信号不能忽略:SIGKILL及SIGSTOP
2)捕捉信号,当信号发生,执行相应的处理函数
3)执行默认操作,如SIGINT、SIGQUIT等信号的默认操作