我正在尝试创建一个以shell命令作为参数的函数,使用fork生成一个执行命令的新进程。我还想重定向命令的标准输出,以便函数的调用者可以使用FILE *指针读取它。
static FILE* runCommand(char* command){
int pfd[2];
if(pipe(pfd)<0)
return NULL;
if(pid=fork()==0){ //child
close(pfd[0]);
dup2(pfd[1],1); //redirect output to pipe for writing
execlp(command,(char*)0);
}
close(pfd[1]);
//return a file pointer/descriptor here?
}
我不知道如何返回一个可用于读取命令输出的文件指针。也就是在shell上执行命令的正确方法?
PS。我读过关于popen但有一个很好的理由我不能使用它,因此我必须自己实现这个功能。
谢谢
答案 0 :(得分:4)
该代码中的一个错误是您分配给未在任何地方声明的变量pid
。并且pid在父级中始终为1,因为编写的代码等同于pid=(fork()==0)
而不是(pid=fork())==0
。
你也应该在dup2调用后关闭pfd [1]。为了更好地衡量,请检查dup2和execlp中的错误。
您真正问题的答案是使用fdopen
。
答案 1 :(得分:1)
使用fdopen
将现有文件描述符与FILE *
对象相关联。其他一切看起来都不错。