首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ - msgsnd & msgrcv似乎不能通信

C++ - msgsnd & msgrcv似乎不能通信
EN

Stack Overflow用户
提问于 2017-03-07 01:33:51
回答 1查看 234关注 0票数 0

我正在尝试让两个进程在C++中进行通信,但是,它似乎不起作用。我有这样的代码:

代码语言:javascript
复制
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>

void sender(int qid)
{
  // declare my message buffer
  struct buf {
    long mtype; // required
    char greeting[50]; // mesg content
  };

  buf msg;
  int size = sizeof(msg)-sizeof(long);

  std::cout << "Type [exit] to stop the program." << std::endl;

  bool exit = false;
  while (!exit)
    {
      std::cout << getpid() << ": ";
      std::cin.getline(msg.greeting, 50, '\n');
      //std::cout << msg.greeting << std::endl;
      msg.mtype = 23;
      if (strcmp(msg.greeting, "exit") == 0)
    exit = true;
      msgsnd(qid, (struct msgbuf *)&msg, size, 0);
    }

}

void receiver(int qid)
{
  // declare my message buffer
  struct buf {
    long mtype;
    char greeting[50];
  };
  buf msg;
  int size = sizeof(msg)-sizeof(long);

  bool exit = false;
  while (!exit)
    {
      msgrcv(qid, (struct msgbuf *)&msg, size, 23, 0);
      if (strcmp(msg.greeting, "exit") == 0)
    exit = true;
      std::cout << getpid() << ": " << msg.greeting << std::endl;
    }
}

int main(int ac, char **av) {

  //spawning two child processes
  pid_t cpid = fork();
  int qid = msgget(IPC_PRIVATE, IPC_EXCL|IPC_CREAT|0600);

  if (cpid == 0) {
    //    execv("./sender", av);
    sender(qid);
    exit(0);
  }
  cpid = fork();
  if (cpid == 0) {
    //execv("./receiver", av);
    receiver(qid);
    exit(0);
  }

  while (wait(NULL) != -1); // waiting for both children to terminate

  msgctl(qid, IPC_RMID, NULL);

  std::cout << "END" << std::endl;

  exit(0);
}

如您所见,sender()等待用户的输入。receiver()正在等待,所以一切都很好。但是,当用户完成输入时,他会按enter键,但是...接收器什么也收不到。

它们有相同的QID,相同的消息大小,相同的ID (23)..我不明白为什么它不能工作。我看到了很多例子,对我来说,这似乎是符合逻辑的,那么,有什么问题呢?

感谢您的帮助

EN

回答 1

Stack Overflow用户

发布于 2017-03-07 01:37:55

此代码中的一个错误是每个进程创建自己的私有IPC队列。

使它们共享同一队列,以便能够通过该队列进行通信:

代码语言:javascript
复制
//spawning two child processes
int qid = msgget(IPC_PRIVATE, IPC_EXCL|IPC_CREAT|0600);
pid_t cpid = fork();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42632017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档