这是对我得到的分配的更正,该分配是在C程序中模拟命令who|grep
。当我测试它时,它按预期工作。
据我所知,当调用fork时,两个进程(子进程和父进程)同时运行,我不了解,是什么使命令以正确的顺序执行,是否有必要管道FD
中可用的数据,因此execlp('wc', 'wc', NULL)
被执行?在从子进程接收到数据之前,它将被阻塞吗?
int fd[2], n;
if(pipe(fd) == -1){
perror("Pipe creation failed");
exit(1);
}
n = fork();
if(n == -1){
perror("Fork error");
exit(2);
}
else if(n == 0){ //son
close(1);
dup(fd[1]);
close(fd[1]);
close(fd[0]);
execlp("who", "who", NULL);
}else{
close(0);
dup(fd[0]);
close(fd[0]);
close(fd[1]);
execlp("wc", "wc", NULL);
}
从我在man 7 pipe
部分中找到的内容管道和FIFO上的I / O :
如果进程尝试从空管道读取,则read(2)将阻塞,直到有可用数据为止。如果某个进程尝试写入一个已满的管道(请参见下文),则write(2)会阻塞,直到从管道中读取了足够的数据以允许写入完成。通过使用fcntl(2)F_SETFL操作启用O_NONBLOCK打开文件状态标志,可以实现非阻塞I / O。
这是否仍适用于从FD
获取输入的execlp之类的功能