qfedu-linux-advanced-level/day5/rec_sed/msgque2_sender.c

90 lines
2.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <sys/types.h> // 系统数据类型定义
#include <sys/ipc.h> // IPC相关头文件
#include <sys/msg.h> // 消息队列相关头文件
#include <string.h> // 字符串操作
#include <stdlib.h> // 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 <type> <content> <title>\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> 可以删除消息队列
*/