我必须编写一个程序来执行与 du |相同的操作排序|命令行中的头会这样做,但我卡住了,我的程序无效。现在的输出是 112。,程序不会终止。请帮忙,我不知道该怎么做!
Result.Failure
}
答案 0 :(得分:1)
让头成为您的父流程,排序 - 其子流程和 du < / b> - 排序 的孩子,或头 的孙子。
你需要两个管道,因此,两个阵列 - fd和fd1。让fd管道用 head 连接 sort ,用 sort 连接fd1 - du 。
您将需要一个大的switch语句,它将确定您当前是否在父进程( head ,pipe(fd)不为0)或子进程( sort ,pipe(fd)为0)。如果您在 sort 中,则需要创建fd1管道并运行孙子进程 du 。现在,由于您再次有两个进程(总共三个),您需要根据您的位置设置管道 - 无论您是孙子进程还是子进程。您可以使用与管道fd类似的switch语句。这里的技巧是正确设置fd1管道的输入和输出。
您的代码必须执行以下操作:
int main(void) {
int fd[2]; // sort <===> head
int fd1[2]; // du <===> sort
pipe(fd);
switch (fork()) {
case 0: // Are we in sort?
pipe(fd1); // If yes, let's make a new pipe!
switch (fork()) {
case 0: // Are we in du?
dup2(fd1[1], STDOUT_FILENO);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/du", "du", (whatever directory), NULL);
exit(1);
default:
/* If not in du, we're in sort! in the middle!
Let's set up both input and output properly.
We have to deal with both pipes */
dup2(fd1[0], STDIN_FILENO);
dup2(fd[1], STDOUT_FILENO);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/sort", "sort (flags if needed)", (char *) 0);
exit(2);
}
exit(3);
default: // If we're not in sort, we're in head
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
execl("/usr/bin/head", "head (flags if needed)", (char *) 0);
exit(4);
}
}