#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
int main(int argc, char const *argv[])
{
int pid;
int p[2];
pipe(p);
if (fork() == 0) // child (receive -> send)
{
pid = getpid();
char buf[2];
if (read(p[0], buf, 1) != 1)
{
fprintf(2, "failed to read in child\n");
exit(1);
}
close(p[0]);
printf("%d: received ping\n", pid);
if(write(p[1], buf, 1) != 1)
{
fprintf(2, "failed to write in child\n");
exit(1);
}
close(p[1]);
exit(0);
}else{ // parent (send -> receive)
pid = getpid();
char info[2] = "a";
char buf[2];
buf[1] = 0;
if (write(p[1], info, 1) != 1)
{
fprintf(2, "failed to write in parent\n");
exit(1);
}
// wait for child to receive ping
close(p[1]);
wait(0);
if(read(p[0], buf, 1) != 1){
fprintf(2, "failed to read in parent\n");
exit(1);
}
printf("%d: received pong\n", pid);
close(p[0]);
exit(0);
}
}
注意问题
1.为什么子进程可以直接read:如果父进程这时候没write,子进程再read时会进入阻塞状态,等父进程write后再read,
2.buf是设置的缓冲区,例如子进程把read的数据存在这里,再写
3.子进程关闭p1不会导致父进程p1关闭,所以可以在read完之后直接关闭p0端
4.fprintf的第一个参数:在 C 语言中,标准输入、标准输出和标准错误输出的文件描述符分别是 0、1 和 2
整体顺序:父进程在p1端写入数据,关闭p1端,开始wait等待子进程,子进程在p0端读入数据,子进程关闭p0端,之后向p1端写入数据,写完之后关闭p1端,退出子进程,之后父进程被唤醒,在p0端读取子进程写的数据,之后关闭p0,退出父进程

2413

被折叠的 条评论
为什么被折叠?



