消息队列
概念
- 消息队列是System V IPC对象的一种
- 消息队列有消息队列ID来唯一标识
- 消息队列就是一个消息列表。用户可以在消息队列中添加消息、读取信息等
- 消息队列可以按照类型来发送/结束消息
消息队列使用步骤
- 打开/创建消息队列 msgget
- 向消息队列发送信息 msgsnd
- 从消息队列接收消息 msgrcv
- 控制消息队列 msgctl
- 打开创建消息队列函数介绍

- 代码实现如下:

- 发送消息函数介绍

- 消息格式

- 发送函数的使用

补充:

- 执行后如何查看已经创建好了:

- 执行ipcs后如下:

- 接收消息:


- 接受消息的主要代码如下:

- 执行如下:

- 消息队列的控制

信号灯概念和有名信号灯
信号量/灯
- 信号量代表某一类资源,其值表示系统中该资源的数量
- 信号量是一个受保护的变量,只能通过三种操作来访问
- 初始化
- P操作(申请资源):消费者
- V操作(释放资源):生产者
- 信号量-P/V操作伪代码实现:

- 三种信号灯
- Posix有名信号灯
- Posix无名信号灯(linux只支持线程同步)
- System V信号灯
- Posix有名信号灯和无名信号灯使用:

- 有名信号灯打开:
sem_t *sem_open(const char *name,int oflag);
sem_t *sem_open(const char *name,int oflag,mode_t mode,unsigned int value);
参数:
name:name是给信号灯起的名字
oflag:打开方式,常用O_CREAT
mode:文件权限。常用0666
value:信号量值。二元信号灯值为1,普通表示资源数目
信号灯文件位置:/dev/shm
有名信号灯关闭
int sem_close(sem_t sem);
有名信号灯的删除
int sem_unlink(const charname); - 信号灯P、V操作

- 读和写信号量使用案例代码如下:

- 写信号量代码:

- 读信号量代码:

- 执行如下:

注:上述代码只能运行一次,运行第二次就不行了,改进如下: - 读信号量添加如下代码:

注:写信号量同上













![[NOIP2011 普及组] 数字反转](https://img-blog.csdnimg.cn/direct/29abc83666914b5f8579b24fc746fbc9.png)





