在我的linux终端上,当我输入

pbmtextps cat | pamfile

然后按回车键。
它给出了以下输出,
stdin:  PBM raw, 83 by 104

但是,我试图通过在主程序中使用execve()来调用“pbmtextps”。以下是程序的片段:
char* haha[] = {"pbmtextps","cat","|", "pamfile", NULL};
if(execve("pbmtextps",haha, NULL) == -1){
    fprintf(stderr, "%s\n", "NOT ok");
   }
else{
    fprintf(stdout, "%s\n", "OK");
}

程序启动后,程序将打印“not ok”。我在同一个终端的同一个目录中运行程序。

最佳答案

execve()不搜索要运行的程序的路径,因此需要给它一个有效的绝对或相对文件名。它也不使用外壳,所以你正在尝试的管道不会工作。参数都直接传递给正在执行的程序。
它也不会返回成功,因为没有什么可以返回,所以打印成功消息是没有意义的。

08-05 00:37