gpt4 book ai didi

c - System V 消息队列 - 获取已存在的消息

转载 作者:行者123 更新时间:2023-11-30 20:34:47 25 4
gpt4 key购买 nike

我一直在开发一个项目,我必须做的任务之一是将从另一个进程接收到的字符串通过管道传递到另一个进程,但这次我必须使用消息队列。

我已经成功地了解了 msgqueue 的工作原理,并制作了一个简单的工作程序,但事实是,它在通过 stdin 接收字符串时起作用fgets.

我的问题是:

我可以传递一个已经保存在其他变量中的字符串吗(例如char s[20] = "message test"; ) 到 msgqueues mtext?

我的简单程序如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>

struct msgbuf {
long mtype;
char string[20];
};
struct msgbuf mbuf;
int open_queue( key_t keyval ) {
int qid;

if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
return(-1);

return(qid);
}

int send_message( int qid){
int result, size;



size = sizeof mbuf.string;
if((result = msgsnd( qid, &mbuf, size, 0)) == -1)
return(-1);

return(result);
}

int remove_queue( int qid ){
if( msgctl( qid, IPC_RMID, 0) == -1)
return(-1);

return(0);
}

int read_message( int qid, long type){
int result, size;


size = sizeof mbuf.string;

if((result = msgrcv( qid, &mbuf, size, type, 0)) == -1)
return(-1);

return(result);
}

int main(void){
int qid;
key_t msgkey;
msgkey = ftok(".", 'm');
if(( qid = open_queue( msgkey)) == -1) {
perror("openErr");
exit(1);
}

mbuf.mtype = 1;
fgets(mbuf.string, sizeof mbuf.string, stdin);

if((send_message( qid)) == -1) {
perror("sendErr");
exit(1);
}


mbuf.mtype = 1;

if((read_message(qid, mbuf.mtype))== -1){
perror("recERR");
exit(1);
}
printf("Queue: %s\n", mbuf.string);
remove_queue(qid);

return 0;
}

最佳答案

您的代码使用 fgets() 用从 stdin 读取的输入填充缓冲区 mbuf.string。您可以改为使用诸如 strcpy(mbuf.string, "message test") 之类的内容,您可以在其中传递变量或使用硬编码字符串。

我建议使用 POSIX 消息队列 API,因为 System V API 已被弃用。

关于c - System V 消息队列 - 获取已存在的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41513709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com