消息队列
概念
- 消息队列是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操作
- 读和写信号量使用案例代码如下:
- 写信号量代码:
- 读信号量代码:
- 执行如下:
注:上述代码只能运行一次,运行第二次就不行了,改进如下: - 读信号量添加如下代码:
注:写信号量同上