C ++ - msgsnd&两个不同程序之间的msgrcv通信

时间:2017-03-07 00:25:55

标签: c++ fork message-queue

我有两个程序,我希望它们通过msgrcv()&&和msgsnd()。我有一个主程序,它启动消息队列并启动另外两个程序:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string>
#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>

int main() {

  int qid = msgget(ftok(".",'u'), 0);

  char* params[3];
  params[1] = (char *)malloc(sizeof(char) * 9);
  sprintf(params[1], "%d", qid);
  params[2] = NULL;

  printf("qid = %d and qid(str) = %s", qid, params[1]);

  //  return (0);

  //spawning two child processes
  pid_t cpid = fork();

  if (cpid == 0) {
    params[0] = (char*)"./sender";
    execv(params[0], params);
    exit(0);
  }
  cpid = fork();
  if (cpid == 0) {
    params[0] = (char*)"./receiver";
    execv(params[0],  params);
    exit(0);
  }

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

  msgctl(qid, IPC_RMID, NULL);

  std::cout << "parent proc: " << getpid()
        << " now exits" << std::endl;

  exit(0);
}

我还准备参数并启动以下两个程序:

发送方

#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>

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

  if (ac != 2)
    return (-1);

  // create my msgQ with key value from ftok()
  //  int qid = msgget(IPC_PRIVATE, IPC_EXCL|IPC_CREAT|0600);
  int qid = atoi(av[1]);
  // declare my message buffer
  struct buf {
    long mtype; // required
    char greeting[50]; // mesg content
  };

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

  std::cout << "Welcome in the prog assignment 2! 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 = 114; // only reading mesg with type mtype = 114
      if (strcmp(msg.greeting, "exit") == 0)
    exit = true;
      msgsnd(qid, (struct msgbuf *)&msg, size, 0);
    }
}

接收器

#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>
#include <stdio.h>

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

  int i = 0;
  while (i < ac)
    printf("AV: %s\n", av[i++]);

  if (ac != 2)
    return (-1);

  //  int qid = msgget(IPC_PRIVATE, IPC_EXCL|IPC_CREAT|0600);
  int qid = atoi(av[1]);
  // 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, 114, 0);
      if (strcmp(msg.greeting, "exit") == 0)
    exit = true;
      std::cout << getpid() << msg.greeting << std::endl;
    }
  std::cout << "get out" << std::endl;
}

它不起作用,我不确定为什么因为,我正在创建消息队列,将其作为参数传递,然后我将其作为int放回然后使用它。然而,它只是给我一个奇怪显示的无限循环,为什么?

欢迎任何帮助..谢谢!

0 个答案:

没有答案
相关问题