发布网友
共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