在C程序中执行shell命令并读取其输出

4

我正在尝试创建一个函数,它以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上执行命令的正确方式?

附:我了解了popen,但我无法使用它,因此必须自己实现此功能。

谢谢。


看起来popen在调用malloc(我可以看到这一点,因为我已经重写了malloc),这给我的项目带来了复杂性。所以我宁愿不调用popen。 - SpotsWood
2个回答

4

这段代码中的一个错误是你给一个未声明的变量pid赋值。而且,因为代码的写法等同于pid=(fork()==0)而不是(pid=fork())==0,在父进程中pid将始终为1。

在dup2调用之后,你还应该关闭pfd[1]。为了保险起见,检查dup2和execlp的错误。

回答你真正的问题是使用fdopen


1
使用fdopen将现有的文件描述符与FILE *对象关联起来。其他方面看起来都很不错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接