消息队列
什么是消息队列
消息队列接口
msgget
msgctl
ipcs -p
msgsnd msgrcv
code示例
发送到消息队列:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>#define MSG_KEY 1234 // 消息队列的键// 消息结构体
struct msg_buffer {long msg_type; // 消息类型,必须是 > 0 的整数char msg_text[100];
};int main() {key_t key;int msgid;struct msg_buffer message;// 获取消息队列的标识符key = MSG_KEY;msgid = msgget(key, 0666 | IPC_CREAT);if (msgid == -1) {perror("msgget failed");exit(1);}// 填充消息内容message.msg_type = 1; // 消息类型,发送者可以使用这个值来区分消息strcpy(message.msg_text, "Hello, this is a test message!");// 发送消息到队列if (msgsnd(msgid, &message, sizeof(message.msg_text), 0) == -1) {perror("msgsnd failed");exit(1);}printf("Message sent: %s\n", message.msg_text);return 0;
}
从消息队列接收
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>#define MSG_KEY 1234 // 消息队列的键// 消息结构体
struct msg_buffer {long msg_type; // 消息类型char msg_text[100];
};int main() {key_t key;int msgid;struct msg_buffer message;// 获取消息队列的标识符key = MSG_KEY;msgid = msgget(key, 0666 | IPC_CREAT);if (msgid == -1) {perror("msgget failed");exit(1);}// 从消息队列接收消息if (msgrcv(msgid, &message, sizeof(message.msg_text), 1, 0) == -1) {perror("msgrcv failed");exit(1);}printf("Message received: %s\n", message.msg_text);// 删除消息队列if (msgctl(msgid, IPC_RMID, NULL) == -1) {perror("msgctl failed");exit(1);}return 0;
}
信号量 semaphoer
在 Linux 中,信号量(Semaphore)是一种用于进程间同步和互斥的机制,通常用于解决多进程或多线程在共享资源时的访问冲突问题。信号量是操作系统提供的一种基础同步工具,广泛用于进程间或线程间的协作,以确保资源的正确访问、避免竞争条件和死锁
详细说明信号量:信号量-CSDN博客
ipcs -s
$ ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems status
0x12345678 12345 user 666 1 allocated
0x23456789 67890 root 644 2 allocated
- key:信号量集的键值,可以是一个由
ftok()
函数生成的唯一标识符。 - semid:信号量集的 ID(标识符),这是系统用来标识信号量集的唯一编号。
- owner:信号量集的所有者,通常是创建信号量集的用户。
- perms:信号量集的权限,显示为一个八进制数,表示访问权限。
- nsems:信号量集包含的信号量数量。
- status:当前状态,通常是 "allocated"(已分配)或 "free"(空闲)
信号量原理图片
资源整体使用 & 资源不是整体使用
IPC资源一定是全局资源,被所有进程看到
内核看IPC/OS如何管理UPC资源
柔性数组,随时扩容:柔性数组-CSDN博客
shm/msg/sem
管理所有ipc资源(指针类型转换后即可访问三者其他成员)
多态原理,kern_ipc_perm为基类
三者为子类
如何知道kern_ipc_perm所在的的ipc类型
并发编程中几个概念
tips
IPC都生命周期随内核,不会自动回收,要手动/重启