2个进程与C中的消息队列进行多次通信

时间:2018-04-24 02:13:08

标签: pipe fork ipc

我在IPC(进程间通信)中遇到了一些问题。任务是制作2个程序:P1& P2。 P1创建一个子节点,P1-parent从控制台获取整数,通过PIPE发送给P1-child。 P1-child接收整数并通过Message Queue将其发送到P2并等待回复。然后,P1返回步骤从控制台取整数,依此类推。 P2从P1接收值并回复OK。之后,P2等待来自P1的消息。 我完成了一次任务,但是我无法在下次完成任务。如果我添加While(1)循环,P1第二次循环无限。我怎么能多次完成它。我认为问题是子和父的顺序在P1中执行代码。但我无法修复它。 这是P1代码:

if (pid > 0)
    {
  /*
   * 1.Accept input from console
   */

  printf("Input a number: ");
  scanf("%d", &numb);
  sprintf(str, "%d", numb);

  /*
   * 2.Send input to child with pipe
   */

  close(pipe_p2c[0]);
  write(pipe_p2c[1], str, strlen(str) + 1);
  close(pipe_p2c[1]);
}
  if (pid == 0)
{
  /*
   * 3.Child receive input
   */

  close(pipe_p2c[1]);
  read(pipe_p2c[0], str_recv, MAXSZ);
  close(pipe_p2c[0]);

  /*
   * 4.Send received value to P2 by msq
   */

  sbuf.mtype = 1;
  strcpy(sbuf.mtext, str_recv);
  printf("%s\n", sbuf.mtext);
  buf_length = strlen(sbuf.mtext) + 1;

  if((msgsnd(msqid, &sbuf, buf_length, 0)) < 0)
    {
      perror("msgsend");
      exit(1);
    }

  /*
   * 5.Receive reply
   */

  if((msgrcv(msqid, &rbuf, MSGSZ, 1, 0)) < 0)
    {
      perror("msgrcv");
      exit(1);
    }

  printf("Received message : %s\n", rbuf.mtext);

} // end if - else (pid ==0)

这是P2代码:

if ((msgrcv(msqid, &rbuf, MSGSZ, 1, 0)) < 0) 
  {
    perror("msgrcv");
    exit(1);
  }

printf("Received message = %s\n", rbuf.mtext);
sscanf(rbuf.mtext, "%d", &numb);

sprintf(sbuf.mtext, "%s", "OK");
sbuf.mtype = 1;
buf_length = strlen(sbuf.mtext) + 1;

if ((msgsnd(msqid, &sbuf, buf_length, 0)) < 0) 
  {
    perror("msgsend");
    exit(1);
  }

0 个答案:

没有答案