【发布时间】:2017-05-21 16:32:04
【问题描述】:
我一直在从事一个项目,我必须做的一项任务是将从另一个进程接收到的字符串通过管道传递给另一个进程,但这次我必须使用消息队列。
我设法了解了msgqueue 的工作原理并制作了一个简单的工作程序,但问题是,它在从stdin 到fgets 接收字符串时工作。
我的问题是:
我可以传递一个已经保存在其他变量中的字符串吗(例如
char s[20] = "message test"; ) 到 msgqueues 多行文本?
我的简单程序如下所示:
#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;
}
【问题讨论】:
-
必须使用 System V 消息队列实现吗? POSIX 消息队列提供了更简洁的 API。
-
无论如何,您为什么认为按照您的描述进行操作会有任何问题?您是否在
msgsnd()的文档中读到了让您这么认为的内容?您确实阅读了它的文档,对吧? -
是的,我必须使用 System V。老实说,我很难理解手册的描述,所以我使用了一些互联网指南来了解它是如何工作的。根据您的问题:我试图用类似的东西运行它:
char s[20] = "test";mbuf.string = *s;但是在编译这些结果时出现错误:从类型'char' -
您不认为询问您实际遇到的错误比询问有关该错误的推测性解释的相关问题更好吗?
-
嗯,我觉得还是问问自己想要达到的结果比较好,如果搞得有点纠结,抱歉。
标签: c linux message-queue