只能用于具有亲缘关系的进程之间的通信
半双工的通信模式,具有固定的读端和写端
管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。
#include
int pipe(int pipefd[2]); //创建管道,得到管道的读端fd[0]和写端fd[1]
参数:
pipefd ---- 存放读写文件描述符的数组首地址
返回值:
成功: 0
失败: -1, 并设置errno
``
无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围
有名管道可以使互不相关的两个进程互相通信。有名管道可以通过路径名来指出,并且在文件系统中可见
进程通过文件IO来操作有名管道
有名管道遵循先进先出规则
不支持如lseek() 操作
有名管道的内容保存在内存中
```c
#include
#include
int mkfifo(const char *pathname, mode_t mode);
参数:
pathname --- 路径 + 名字
mode --- 权限,一般0664
返回值:
成功: 0
失败: -1, 并设置errno
使用: open close read write
* 管道只有在读写端存在时才有意义
* 写端存在时,当管道中有数据时,读端可以读到数据,没有数据时,读端阻塞。但是写端关闭时,读端会把管道中的数据都读走后返回0
* 当读端存在时但不读取数据,写端把管道缓冲区写满后会阻塞,直到读端读走数据就可以继续写入
* 当读端关闭时,写端再向管道中写入,会出现管道破裂的信号(SIGPIPE)导致进程结束
用户进程对信号的响应方式:
* 忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。
* 捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。
* 执行缺省操作:Linux对每种信号都规定了默认操作
#include
int kill(pid_t pid, int sig);
参数:
pid: 进程号, 0:同一个进程组, -1:信号发给所有的进程表中的进程(除了进程号最大的进程外)
sig: 信号
返回值:
成功: 0
失败: -1, 并设置errno
#include
int raise(int sig);
参数:
sig: 信号
返回值:
成功: 0
失败: 非0
#include
unsigned int alarm(unsigned int seconds);
参数:
seconds: 秒
返回值:
#include
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
参数:
signum: 信号
handler:
SIG_IGN: 忽略信号
SIG_DFL: 缺省信号
函数的入口地址: 捕获信号
key: IPC_PRIVATE, ftok
创建或打开共享内存:shmget
把共享内存映射到用户空间: shmat
解除映射: shmdt
销毁共享内存:shmctl
消息队列可以使用类型来发送和接收消息
key: IPC_PRIVATE, ftok
创建或打开消息队列:msgget
添加消息(发送消息): msgsnd
读取消息(接收消息): msgrcv
控制消息(删除消息队列): msgctl
二值信号灯:值为0或1。与互斥锁类似,资源可用时值为1,不可用时值为0。
计数信号灯:值在0到n之间。用来统计资源,其值代表可用资源数
等待操作是等待信号灯的值变为大于0,然后将其减1;而释放操作则相反,用来唤醒等待资源的进程或者线程
System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯
System V 信号灯由内核维护
主要函数semget,semop,semctl