管道模型

管道分为两种类型:
- “|” 表示的管道称为匿名管道,意思就是这个类型的管道没有名字,用完了就销毁了。
- 命名管道。这个类型的管道需要通过 mkfifo 命令显式地创建。
# 在当前目录创建了名为 "hello" 的管道文件$ mkfifo hello$ ls -lprw-r--r-- 1 root root 0 May 21 23:29 hello# 写入字符串# 没有读者, 阻塞$ echo "hello world" > hello# 在新终端中读取$ cat < hellohello world
- 管道的使用模式,不适合进程间频繁地交换数据。
消息队列模型

创建一个消息队列,使用 msgget 函数:
#include <stdio.h>#include <stdlib.h>#include <sys/msg.h>int main() {int messagequeueid;key_t key;if((key = ftok("/root/messagequeue/messagequeuekey", 1024)) < 0){perror("ftok error");exit(1);}printf("Message Queue key: %d.\n", key);if ((messagequeueid = msgget(key, IPC_CREAT|0777)) == -1){perror("msgget error");exit(1);}printf("Message queue id: %d.\n", messagequeueid);}
共享内存模型

信号量
信号量其实是一个计数器,主要用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
对于信号量来讲,会定义两种原子操作:
- 一个是 P 操作,我们称为申请资源操作。这个操作会申请将信号量的数值减去 N,表示这些数量被他申请使用了,其他人不能用了。
- 另一个是 V 操作,我们称为归还资源操作,这个操作会申请将信号量加上 M,表示这些数量已经还给信号量了,其他人可以使用了。
信号
异常情况下的工作模式.
