#include #include // 系统数据类型定义 #include // IPC相关头文件 #include // 消息队列相关头文件 #include // 字符串操作 #include // atol 函数 // 消息结构体 typedef struct msg_ { long mType; // 消息类型,必须是 long ,必须在第一个位置 char content[100]; // 消息内容,需要小于消息队列的限制值(8192) char title[32]; // 消息标题 } MSG; // msgget 函数用于创建消息队列,参数1是键值,参数2是权限 int main(int argc, char *argv[]) { // 判断参数个数 if (argc != 4) { printf("Usage: %s \n", argv[0]); return 1; } key_t key = ftok("/", 200); // 获取消息队列的键值 // msgget 函数用于创建消息队列,参数1是键值,参数2是权限 // 返回值是消息队列的标识符,类似于文件描述符 // IPC_CREAT 表示如果消息队列不存在则创建,如果存在则打开 // 0644 表示权限,类似于文件权限,表示所有者可读写,其他人只读 int msgqid = msgget(key, IPC_CREAT | 0666); // 创建消息队列 if (msgqid == -1) { perror("msgget"); return 1; } // msgqid 只要不是 -1 就表示创建成功 printf("msgqid = %d\n", msgqid); // 打印消息队列标识符 // 发送消息 // 1 表示类型,表示发送消息的类型,必须大于 0 // MSG msg1 = {1, "测试消息队列的发送函数 msgsnd", "测试"}; // 消息内容 MSG msg1; msg1.mType = atol(argv[1]); // 消息类型 strcpy(msg1.content, argv[2]); // 消息内容 strcpy(msg1.title, argv[3]); // 消息标题 // 参数 4 表示阻塞,如果消息队列满了,发送消息的进程会阻塞 // 非阻塞的话,消息队列满了,发送消息的进程会立即返回,不会阻塞 // int ret = msgsnd(msgqid, &msg1, sizeof(msg1.content), 0); // 发送消息 int ret = msgsnd(msgqid, &msg1, sizeof(msg1.content) + sizeof(msg1.title), IPC_NOWAIT); // 发送消息 if (ret == -1) { perror("msgsnd"); return 1; } printf("msg1 发送成功\n"); return 0; } /* ipc: inter process communication 进程间通信 ipcs -q // 查看消息队列 ipcrm -q <msqid> // 删除消息队列 */ /* ipc 通信方式 1. 管道 2. 消息队列 3. 共享内存 4. 信号量 5. 套接字 */ /* 使用说明,配合 msgque3_receiver.c (receiver) 使用: 1. 编译 msgque2_sender.c (sender) 和 msgque3_receiver.c (receiver) 2. 运行 msgque2_sender.c (sender) 发送消息 3. 运行 msgque3_receiver.c (receiver) 接收消息 ipcs -q 可以查看消息队列 ipcrm -q <msqid> 可以删除消息队列 */