C forks和pipes实现linux编译器
以下代码取自的C forks和pipes实现linux编译器,c,linux,fork,pipe,C,Linux,Fork,Pipe,以下代码取自的 #包括 #包括 #包括 内部主(空) { int-pfds[2]; 管道(pfds); 如果(!fork()){ 关闭(1);/*关闭正常标准输出*/ dup(pfds[1]);/*使标准输出与pfds[1]相同*/ 关闭(pfds[0]);/*我们不需要这个*/ execlp(“ls”、“ls”、NULL); }否则{ 关闭(0);/*关闭正常标准*/ dup(pfds[0]);/*使标准DIN与pfds[0]相同*/ 关闭(pfds[1]);/*我们不需要这个*/ execl
#包括
#包括
#包括
内部主(空)
{
int-pfds[2];
管道(pfds);
如果(!fork()){
关闭(1);/*关闭正常标准输出*/
dup(pfds[1]);/*使标准输出与pfds[1]相同*/
关闭(pfds[0]);/*我们不需要这个*/
execlp(“ls”、“ls”、NULL);
}否则{
关闭(0);/*关闭正常标准*/
dup(pfds[0]);/*使标准DIN与pfds[0]相同*/
关闭(pfds[1]);/*我们不需要这个*/
execlp(“wc”、“wc”、“-l”、NULL);
}
返回0;
}
此代码允许用户查看特定目录中有多少文件。如何编辑此代码以实现较长的管道
cat/etc/passwd | cut–f1–d:| sort
?有人知道怎么做吗,因为我完全被卡住了。任何帮助都将不胜感激。感觉像是家庭作业,所以我给你一些建议:
- 较长的管道有两个管道,因此需要调用pipe()两次。(我也会检查管道的返回值,而我是在它。)
- 有三个过程,即两个分叉。再次,正确地检查fork()的返回值:它是三种状态:父、子或失败,您的程序应该测试这三种情况
- 如果预先两次调用pipe(),请仔细考虑每个进程中的哪些文件描述符(即管道的哪些端点)以及在调用execlp()之前关闭哪些文件描述符。我会画一幅画
- 我更喜欢dup2()而不是dup(),因为您显式地设置了目标文件描述符,因此在调用中指定它是有意义的。也避免了愚蠢的错误
- dup和execlp可能会失败,所以我也会检查它们的返回值
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if (!fork()) {
close(1); /* close normal stdout */
dup(pfds[1]); /* make stdout same as pfds[1] */
close(pfds[0]); /* we don't need this */
execlp("ls", "ls", NULL);
} else {
close(0); /* close normal stdin */
dup(pfds[0]); /* make stdin same as pfds[0] */
close(pfds[1]); /* we don't need this */
execlp("wc", "wc", "-l", NULL);
}
return 0;
}