C 程序对三个命令执行管道
C program to perform a pipe on three commands
我必须编写一个程序来执行与 du | 相同的操作排序 |命令行中的 head 可以,但我卡住了,我的程序无法运行。现在的输出是 112 . 并且程序不会终止。请帮忙,我不知道该怎么办!
int main(void) {
int fd[2];
int fd1[2];
int pid;
if (pipe(fd) == -1) {
perror("Pipe");
exit(1);
}
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
execl("/usr/bin/du", "du", (char *) 0);
exit(3);
}
if (pipe(fd1) == -1) {
perror("Pipe");
exit(1);
}
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd[0], STDIN_FILENO);
dup2(fd1[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/sort", "sort", (char *) 0);
exit(3);
}
close(fd[0]);
close(fd[1]);
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd1[0], STDIN_FILENO);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/head", "head", (char *) 0);
exit(3);
}
}
让 head 成为您的 父进程 、sort — 它的 子进程 和 du — sort 的 子进程,或 head.
的孙子
您需要两个管道,因此需要两个数组 — fd 和 fd1。让 fd 管道连接 sort 和 head,fd1 — du 和 sort .
你需要一个大的switch语句,它会判断你当前是在父进程(head,pipe(fd)不为0)还是子进程(排序,管道(fd)为0)。如果你在 sort,你需要创建 fd1 管道和 运行 grandchild process 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);
}
}
我必须编写一个程序来执行与 du | 相同的操作排序 |命令行中的 head 可以,但我卡住了,我的程序无法运行。现在的输出是 112 . 并且程序不会终止。请帮忙,我不知道该怎么办!
int main(void) {
int fd[2];
int fd1[2];
int pid;
if (pipe(fd) == -1) {
perror("Pipe");
exit(1);
}
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
execl("/usr/bin/du", "du", (char *) 0);
exit(3);
}
if (pipe(fd1) == -1) {
perror("Pipe");
exit(1);
}
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd[0], STDIN_FILENO);
dup2(fd1[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/sort", "sort", (char *) 0);
exit(3);
}
close(fd[0]);
close(fd[1]);
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd1[0], STDIN_FILENO);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/head", "head", (char *) 0);
exit(3);
}
}
让 head 成为您的 父进程 、sort — 它的 子进程 和 du — sort 的 子进程,或 head.
的孙子您需要两个管道,因此需要两个数组 — fd 和 fd1。让 fd 管道连接 sort 和 head,fd1 — du 和 sort .
你需要一个大的switch语句,它会判断你当前是在父进程(head,pipe(fd)不为0)还是子进程(排序,管道(fd)为0)。如果你在 sort,你需要创建 fd1 管道和 运行 grandchild process 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);
}
}