我不会撒谎的。这是一个家庭作业问题。然而,就我而言,这些点都不见了,宝贝不见了。现在,我只是在寻找答案,因为我 - 认为 - 我可能疯了。
该程序的目标是以ps -A | grep (inputstring) | wc -l
类似于 shell 的方式执行命令。因此,我生成了这些进程,并让它们相互等待。最新的流程,曾孙,execlp("ps","ps","-A",NULL)
它用ps -A
流程代替了自己。在它之前execlp
,我确保它的标准输出将进入管道输出。行中的下一个进程是wait()
ing,并且已经自行设置,以便输入管道进入标准输入,标准输出进入输出管道,它将执行 grep,依此类推。
我几乎可以肯定我已经正确设置了它。然而……程序确实如此。不是。工作。
#include <stdlib.h>
#include <iostream>
#include <string>
#define MAXLINE 1500
#define READ 0
#define WRITE 1
using namespace std;
int main( int argc, char** argv ) {
//* start of input block
if ( argc != 2 ) {
cout << "Usage: ./a.out arg1" << endl;
return 0;
}
string in = argv[1];
// end of input block */
int pipeA[2], pipeB[2], pid, stat;
// get our first set of pipes
if ( pipe(pipeA) < 0 ) {
cerr << "Pipe error.\n";
exit(-1);
}
if ( pipe(pipeB) < 0 ) {
cerr << "Pipe error.\n";
exit(-1);
}
// make the first fork
if ( (pid = fork() ) < 0 ) { cerr << "Fork error.\n"; exit(-1); }
if ( pid > 0 ) { // parent case
wait(&stat);
} else { // child case
if ( (pid = fork()) < 0 ) { cerr << "Fork Error\n"; exit(-1); }
if ( pid > 0 ) { // child
wait(&stat);
dup2(pipeA[READ],READ);
execlp("wc","wc","-l",NULL);
} else { // grand-child
if ( (pid = fork()) < 0 ) { cerr << "Fork Error\n"; exit(-1); }
if ( pid > 0 ) { // still grand-child
wait(&stat);
dup2(pipeB[READ],READ);
dup2(pipeA[WRITE],WRITE);
close(pipeB[READ]);
execlp("grep","grep",in.c_str(),NULL);
} else { // great grand-child
dup2(pipeB[WRITE],WRITE); // t now goes to pipeB[1]
close(READ);
close(pipeB[READ]);
execlp("ps", "ps", "-A", NULL);
}
}
}
return 0;
}
编辑:更改为我的代码的两管变体。