【问题标题】:Blocking nature of msgrcvmsgrcv 的阻塞性质
【发布时间】: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


【解决方案1】:

当我在 cmets 中得到响应时,每当我需要向控制台显示输出时, 我只需要使用fflush(stdout)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2013-11-07
    • 2018-05-29
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多