我尝试使用管道进行基本的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*/
}
}
答案 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);