首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

LINUX 消息队列读写问题

发布网友

我来回答

3个回答

热心网友

消息队列是随内核持续存在的,里面的消息是被读取时就被删掉了。消息队列和消息是不一样的。我是这样理解的。追问哦
也就是说虽然一直存在,但是只要读那么一次就被删掉是吧,可是为什么要这么做呢
有没有办法让他读取后不删除呢,比如flag之类的?我找了下好像没有类似的flag

追答应该不行吧,正常情况下系统会使用大量的消息,不删除的话,肯定是不行的。消息队列貌似没提供这种保持功能。楼主是在单纯地学习消息队列机制还是只是应用消息队列?如果是学习,楼主可以考虑修改内核代码,如果是应用,可以考虑其他的方式,像共享内存。

热心网友

题目:编写两程序,程序1从消息队列接收消息,程序2则发送消息(假设发送的消息我的作业,你凑合着用吧 //msgq_send.c #include追问哥哥 不要这样...

热心网友

我的作业,你凑合着用吧
//msgq_send.c
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>

#define MAXSIZE 256

int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("Error args\n");
return -1;
}

int msgid;

msgid = msgget((key_t)2000, IPC_CREAT | 04);
if (msgid == -1)
{
printf("msgget error\n");
return -1;
}

if (msgsnd(msgid, (void *)argv[1], MAXSIZE, 0) == -1)
{
printf("msgsnd error\n");
return -1;
}

return 0;
}

//msgq_recv.c
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>

#define MAXSIZE 256

int main(void)
{
int msgid;
int msgsize;
char buff[MAXSIZE];

msgid = msgget((key_t)2000, IPC_CREAT | 04);
if (msgid == -1)
{
printf("msgget error\n");
return -1;
}

msgsize = msgrcv(msgid, (void *)&buff, MAXSIZE, 0, 0);
if (msgsize == -1)
{
printf("msgrcv error\n");
return -1;
}

printf("%s\n", buff);

return 0;
}

//Makefile
TARGET := msgq_send msgq_recv
CC := gcc
CFLAGS := -Wall -g

all: msgq_send msgq_recv

msgq_send: msgq_send.o
$(CC) $(CFLAGS) $^ -o $@

msgq_recv: msgq_recv.o
$(CC) $(CFLAGS) $^ -o $@

clean:
rm -fr *.o $(TARGET)

.PHONY :clean

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com