我在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);
}