管道模型
管道分为两种类型:
- “|” 表示的管道称为匿名管道,意思就是这个类型的管道没有名字,用完了就销毁了。
- 命名管道。这个类型的管道需要通过 mkfifo 命令显式地创建。
# 在当前目录创建了名为 "hello" 的管道文件
$ mkfifo hello
$ ls -l
prw-r--r-- 1 root root 0 May 21 23:29 hello
# 写入字符串
# 没有读者, 阻塞
$ echo "hello world" > hello
# 在新终端中读取
$ cat < hello
hello 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,表示这些数量已经还给信号量了,其他人可以使用了。
信号
异常情况下的工作模式.