我是Linux的新手,并在C中使用管道。我正在尝试编写一个程序来执行以下命令:ps aux | grep root | wc -l
使用管道。
问题是我的程序没有在终端中显示任何内容,这与原始命令不一样!
这是我的代码:
#include <stdlib.h> // exit
#include <stdio.h> // printf
#include <unistd.h> // execlp
int main(int argc, char *argv[]) {
int p1[2], p2[2];
int f1, f2;
if(pipe(p1) == -1) {
exit(1);
}
if(pipe(p2) == -1) {
exit(2);
}
f1 = fork();
if(f1 < 0) {
exit(1);
} else if(f1 == 0) {
close(p1[1]);
close(0);
dup2(p1[0], 0);
close(p1[0]);
close(p2[0]);
close(1);
dup2(p2[1], 1);
close(p2[1]);
execlp("grep", "grep", "root", NULL);
} else {
f2 = fork();
if(f2 < 0) {
exit(2);
} else if(f2 == 0) {
close(p2[1]);
close(0);
dup2(p2[0], 0);
close(p2[0]);
execlp("wc", "wc", "-l", NULL);
} else {
close(p1[0]);
close(1);
dup2(p1[1], 1);
close(p1[1]);
execlp("ps", "ps", "aux", NULL);
}
}
}
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int p1[2], p2[2];
int f1, f2, f3;
if(pipe(p1) == -1) {
exit(1);
}
f1 = fork();
if(f1 < 0) {
exit(1);
}
else if(f1 == 0) {
dup2(p1[1], 1);
close(p1[0]);
close(p1[1]);
execlp("ps", "ps", "aux", NULL);
perror("ps");
exit(1);
}
if(pipe(p2) == -1) {
exit(1);
}
f2 = fork();
if(f2 < 0) {
exit(1);
}
else if(f2 == 0) {
dup2(p1[0], 0);
close(p1[0]);
close(p1[1]);
dup2(p2[1], 1);
close(p2[0]);
close(p2[1]);
execlp("grep", "grep", "root", NULL);
perror("grep");
exit(1);
}
f3 = fork();
if(f3 < 0) {
exit(1);
}
else if(f3 == 0) {
dup2(p2[0], 0);
close(p2[0]);
close(p2[1]);
close(p1[0]);
close(p1[1]);
execlp("wc", "wc", "-l", NULL);
perror("wc");
exit(1);
}
close(p1[0]);
close(p1[1]);
close(p2[0]);
close(p2[1]);
wait(NULL);
wait(NULL);
wait(NULL);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句