Linux msgqueue

本文介绍了一个使用C语言实现的消息队列程序示例,包括发送、接收消息、修改权限及删除消息队列等基本操作。该程序通过命令行参数进行不同功能的选择,并展示了实际运行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mq.c

#include <stdio.h>

#include <ctype.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>


#define MAX_SEND_SIZE 80


struct mymsgbuf{
long mtype;
char mtext[MAX_SEND_SIZE];
};


void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text);
void read_message(int qid, struct mymsgbuf *qbuf, long type);
void change_queue_mode(int qid, char *mode);
void remove_queue(int qid);
void usage(void);


int main(int argc, char* argv[])
{
key_t key;
int msgqueue_id;
struct mymsgbuf qbuf;


if (argc == 1)
usage();


key = ftok(".",'m');


if ((msgqueue_id = msgget(key, IPC_CREAT|0660))==-1)
{
perror("msgget");
exit(1);
}


switch(tolower(argv[1][0]))
{
case 's':
send_message(msgqueue_id, (struct mymsgbuf *)&qbuf, atol(argv[2]),argv[3]);
break;
case 'r':
read_message(msgqueue_id, &qbuf, atol(argv[2]));
break;
case 'd':
remove_queue(msgqueue_id);
break;
case 'm':
change_queue_mode(msgqueue_id, argv[2]);
break;
default:usage();
}
return 0;
}


void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text)
{
printf("sending a message...\n");


qbuf->mtype = type;


strcpy(qbuf->mtext, text);


if ((msgsnd(qid, (struct msgbuf *)qbuf, strlen(qbuf->mtext)+1,0))==-1)
{
perror("msgsnd");
exit(1);
}
}


void read_message(int qid, struct mymsgbuf *qbuf, long type)
{
printf("reading a message...\n");


qbuf->mtype = type;


msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0);


printf("Type : %ld Text:%s\n", qbuf->mtype, qbuf->mtext);
}


void change_queue_mode(int qid, char *mode)
{
struct msqid_ds myqueue_ds;


msgctl(qid, IPC_STAT, &myqueue_ds);


sscanf(mode, "%ho", &myqueue_ds.msg_perm.mode);


msgctl(qid, IPC_SET, &myqueue_ds);
}


void remove_queue(int qid)
{
msgctl(qid, IPC_RMID, 0);
}


void usage(void)
{
fprintf(stderr, "msgtool - A utility for tinkering whit msg queues\n");
fprintf(stderr, "\nUSAGE:msgtool (s)end<type><messagetext>\n");
fprintf(stderr, "                (r)ecv<type>\n");
fprintf(stderr, "                (d)elete\n");
fprintf(stderr, "                (m)ode<octal mode>\n");
exit(1);

}

发送消息:

mq s (type) text

取得消息:

mq r (type)

修改权限:

mq m (mode)

删除消息队列:

mq d



#cc mq.c -o mq -g

#./mq s 1 tt

sending a message...

#./mq s 1 t2

sending a message...

#./mq s 2 tt

sending a message...

#./mq r 1
reading a message...
Type : 1 Text:tt
#./mq r 2
reading a message...
Type : 2 Text:tt
#./mq r 1
reading a message...
Type : 1 Text:t2









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值