Mit6.S081-实验1-Xv6 and Unix utilities-pingpong问题
在进行pingpong实验的时候遇到了许多问题在这里记录一下。
1.输出乱序问题
出现这个问题主要是因为没有弄懂wait(0)的作用,
wait(0)暂时停止目前进程的执行,直到信号来到或子进程结束,如果在调用wait(0)时子进程已经结束,则wait(0)会立即返回子进程结束状态值。
作者:桀异-Noneofmine https://www.bilibili.com/read/cv8074900/ 出处:bilibili
在父进程和子进程之间使用pipe管道传输数据时,需要等待子进程的传输完成后,父进程再进行读取
pingping实验对管道的读写顺序应该如下:
1、父进程在管道写端写入信息
2、子进程在管道读端读取数据
3、子进程在管道写端写入信息
4、父进程再管道读端读取数据
如果使用一个管道完成应该在每次读写之后关闭所使用的端口,如果使用两个管道完成,应该先关闭不使用的端口
子进程读写管道过程
if(fork()==0)
{
if(read(p1[0],buf,msgsize)!=msgsize)
{
printf("c r p1[0] error\n");
exit(1);
}
close(p1[0]);
printf("%d: received %s\n",getpid(),buf);
if(write(p1[1],"pong",msgsize)!=msgsize)
{
printf("c w p1[1] error\n");
exit(1);
}
close(p1[1]);
exit(0);
}
父进程读写管道过程
if(write(p1[1],"ping",msgsize)!=msgsize)
{
printf("f w p1[1] error\n");
exit(1);
}
close(p1[1]);
wait(0); //注意在父进程中读取管道信息之前应该等待子进程完成写入信息操作,所以在这里使用wait
if(read(p1[0],buf,msgsize)!=msgsize)
{
printf("f r p2[0] error\n");
exit(1);
}
close(p1[0]);
printf("%d: received %s\n",getpid(),buf);
exit(0);