本实验实现父子进程之间的管道通信。程序中由父进程创建一个匿名管道,并创建了2个子进程。两个子进程都从管道写端(入口)写入一个发给父进程的消息(字符串),父进程则从管道读端(出口)读取发来的两个消息。 三、实验主要步骤 (1)程序设计 下面是程序的部分代码,请完成该程序的设计。 /test5_1.c:匿名管道/ # include <stdio.h> # include <unistd.h> int main( ) { int i ,p1 ,p2 , pid , fd[2] ; char buf[80]; <创建一个匿名管道> while((p1=fork( ))==-1); if (p1==0) { /子进程1代码/ sprintf (buf,”Message of child_1”); /在buf中写入消息文本/ <向管道写入消息> printf (“Child_1 write an message to pipe!\n”); for( i=0; i<99999; i++); <终止> } else{ while((p2=fork())==-1); if (p2==0){ /子进程2代码/ sprintf (buf,”Message of child_2”); <向管道写入消息> printf (“Child_2 write an message to pipe!\n”); for( i=0; i<99999; i++); <终止> } else { /父进程代码/ <等待子进程终止> <从管道中先后读出两个消息,并输出相关提示信息> <关闭管道> printf(“OVER\n”); } } return 0; }有没有出现不符合要求的输出结果,问题出在什么地方?你是如何修改?帮我分析一下
时间: 2024-03-02 16:51:09 浏览: 45
程序可能会出现不符合要求的输出结果,问题出在父进程从管道中读取消息时没有按照子进程写入的顺序先后读出两个消息。为了解决这个问题,可以在父进程中使用两个循环分别读取两个子进程写入的消息,或者在子进程写入消息时加上一个编号,父进程按照编号的顺序读取消息。下面是修改后的代码示例:
```
#include <stdio.h>
#include <unistd.h>
int main() {
int i, p1, p2, pid, fd[2];
char buf[80];
if (pipe(fd) < 0) { // 创建匿名管道
printf("Create pipe error!\n");
return -1;
}
while ((p1 = fork()) == -1);
if (p1 == 0) {
sprintf(buf, "Message of child_1");
write(fd[1], buf, sizeof(buf));
printf("Child_1 write a message to pipe!\n");
sleep(1);
return 0;
} else {
while ((p2 = fork()) == -1);
if (p2 == 0) {
sprintf(buf, "Message of child_2");
write(fd[1], buf, sizeof(buf));
printf("Child_2 write a message to pipe!\n");
sleep(1);
return 0;
} else {
waitpid(p1, NULL, 0);
waitpid(p2, NULL, 0);
for (i = 0; i < 2; i++) {
read(fd[0], buf, sizeof(buf));
printf("Parent read a message from pipe: %s\n", buf);
}
close(fd[0]);
close(fd[1]);
printf("OVER\n");
}
}
return 0;
}
```
在修改后的代码中,父进程使用了两个循环分别读取两个子进程写入的消息,保证了消息的先后顺序。同时,在子进程写入消息时没有加上编号,因为使用两个循环的方式已经保证了消息的顺序,不需要再使用编号区分。
阅读全文