管道模型

image.png

管道分为两种类型:

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

消息队列模型

image.png

创建一个消息队列,使用 msgget 函数:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/msg.h>
  4. int main() {
  5. int messagequeueid;
  6. key_t key;
  7. if((key = ftok("/root/messagequeue/messagequeuekey", 1024)) < 0)
  8. {
  9. perror("ftok error");
  10. exit(1);
  11. }
  12. printf("Message Queue key: %d.\n", key);
  13. if ((messagequeueid = msgget(key, IPC_CREAT|0777)) == -1)
  14. {
  15. perror("msgget error");
  16. exit(1);
  17. }
  18. printf("Message queue id: %d.\n", messagequeueid);
  19. }

共享内存模型

image.png

信号量

信号量其实是一个计数器,主要用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

对于信号量来讲,会定义两种原子操作:

  • 一个是 P 操作,我们称为申请资源操作。这个操作会申请将信号量的数值减去 N,表示这些数量被他申请使用了,其他人不能用了。
  • 另一个是 V 操作,我们称为归还资源操作,这个操作会申请将信号量加上 M,表示这些数量已经还给信号量了,其他人可以使用了。

信号

异常情况下的工作模式.