为什么使用`execl`而不是`system`会阻止我的程序运行?

时间:2015-05-15 14:36:11

标签: c linux unix pipe ipc

我尝试使用管道进行基本的IPC。我花了几个小时搜索互联网,这样做,阅读API文档,最后得到以下代码。但它没有用,正如我所料。任何帮助我的代码工作'非常感谢。

<编辑>
我刚刚发现使用system代替execl可以让我的程序按预期运行完美。那么当我使用execl时会发生什么问题,而system函数却不会发生这种情况?
< /编辑>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void){
    int hInPipe[2];
    int hOutPipe[2];
    FILE *hInFile;
    FILE *hOutFile;
    char *s;

    pipe(hInPipe);
    pipe(hOutPipe);
    if(fork()){
        close(hInPipe[0]);
        close(hOutPipe[1]);
        hInFile=fdopen(hInPipe[1],"w");
        fprintf(hInFile,"2^100\n");
        fclose(hInFile);
        hOutFile=fdopen(hOutPipe[0],"r");
        fscanf(hOutFile,"%ms",&s);
        fclose(hOutFile);
        printf("%s\n",s);
        free(s);
    }else{
        dup2(hInPipe[0],STDIN_FILENO);
        dup2(hOutPipe[1],STDOUT_FILENO);
        close(hInPipe[0]);
        close(hInPipe[1]);
        close(hOutPipe[0]);
        close(hOutPipe[1]);

        system("bc -q");/*this works*/
        /*execl("bc","-q",NULL);*/ /*but this doesn't*/
    }
}

1 个答案:

答案 0 :(得分:2)

阅读精美的男人页面。 :)

execl(const char *path, const char *arg0, ... /*, (char *)0 */);

arg0(又名argv [0],程序被告知它被调用的名称)与路径相同的参数(所述程序的可执行文件的位置) )。此外,execl作为第一个参数,是一个完全限定的路径名​​。

因此,你想:

execl("/usr/bin/bc", "bc", "-q", NULL);

...或者,在PATH中搜索bc而不是硬编码位置:

execlp("bc", "bc", "-q", NULL);