进程间通信的 五种方式:(ipcs 命令可查看全部的 信号量,消息队列,共享内存)
管道
信号量 ipcs -s semid查看信号量 ipcrm -s semid 删除信号量
共享内存 ipcs -m ipcrm -m
消息队列 ipcs -q ipcrm -q
套接字
管道:
管道文件是存储在内存上的,因此大小恒为0,管道有两种: 有名管道(mkfifo创建) 和 无名管道(pipe创建)
管道的三个性质:
1. 半双工
2.管道的数据在内存里
3.有名管道和无名管道的区别:有名管道在任意两个进程间可以通信,无名管道只能在父子进程之间通信
管道在使用时的性质:
1.写端未关闭,管道为空,读端阻塞
2.写端关闭,读端read函数的返回值为0,读端也关闭
3.读端关闭,写端打开,写端在收到 SIGPIPE (13号)信号后关闭,因为写不进去了
4.无名管道: int fd[2]; pipe(fd); 则 fd[0]为读端, fd[1]为写端,这是固定的,因此在父子进程中使用无名管道时要确定一个管道的读取方向,关闭一组读写端
管道的实现方式:
信号量:
信号量:是特殊的变量,是实现对临界资源的访问控制(同步),用来标识能不能访问其控制的临界资源一般取整数,表示的是资源数目,信号量值得改变是一个原子操作
临界资源:同一时刻只允许一个进程访问的资源
临界区:访问临界资源的代码段
引入信号量主要书=是为了解决如下问题:
明显的看到这里有两个进程实现i++,但是最后的结果可能是 i=1,因为在左边进程未完成时右边进程去拿i 的值,i 此时还是 1,导致加了两次,但是结果却是 1