【发布时间】:2019-12-06 11:53:06
【问题描述】:
我使用消息队列将消息从一个进程发送到另一个进程。只有在对msgrcv 函数的所有调用完成后,接收消息的进程才会打印输出。我所期望的是它会在收到消息时打印数据,但只有在收到所有消息后才会打印数据。
我已尝试更改权限。我用过0666 | IPC_NOWAIT, 0666 | IPC_NOWAIT | IPC_CREAT。
server.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>
struct mesg_buffer {
long mtype;
char mtext[100];
};
int main(void){
struct mesg_buffer message;
int sq_msgid, uq_msgid;
int num_users = 0;
sq_msgid = msgget(ftok("server_queue",1), 0666 | IPC_CREAT);
uq_msgid = msgget(ftok("user_queue",1), 0666 | IPC_CREAT);
for(int i=0;i<2;i++){
printf("%ld",msgrcv(sq_msgid, &message, sizeof(message), 1, 0));
}
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <string.h>
struct mesg_buffer {
long mtype;
char mtext[100];
};
int main(void){
struct mesg_buffer message;
int sq_msgid, uq_msgid;
sq_msgid = msgget(ftok("server_queue",1), 0666 | IPC_CREAT);
strcpy(message.mtext, "join");
message.mtype = 1;
int r = msgsnd(sq_msgid, &message, sizeof(message), 0);
printf("%d", r);
}
【问题讨论】:
-
尝试在
printf()调用中添加换行符,或在它们之后使用fflush(stdout)。 -
认为会的。与
msgrcv()无关,与stdio 缓冲有关。 -
为什么我们需要在这里刷新输出?
-
stackoverflow.com/questions/1716296/… 另外,您没有检查来自
ftok()的返回值。使用ftok()获取消息队列ID 非常容易出错。该文件必须存在,无法保证如果删除并重新创建该文件,您最终会得到相同的数字,并且无法保证即使ftok()有效,您也会得到一个唯一标识消息队列的值-ftok()可以返回一个值,该值将引用已被某人/其他人使用的队列。 -
@s.singh 您需要刷新(或在打印中使用 '\n'),因为 printf(和 stdio 的其他功能)通过在显示任何内容之前等待这两个触发器之一进行某种优化.然后它减少了对 write () 的调用量,它隐藏了一个系统调用并固定了你的程序;)
标签: c message-queue