为什么使用'execl'而不是'system'会阻止我的程序工作?

为什么使用'execl'而不是'system'会阻止我的程序工作?,c,linux,unix,pipe,ipc,C,Linux,Unix,Pipe,Ipc,我正在尝试使用管道进行基本IPC。我花了几个小时在互联网上搜索,做这做那,阅读API文档,最后得到了下面的代码。但正如我所预料的那样,它不起作用。任何帮助我的代码“工作”都将非常感谢 我刚刚发现,使用system而不是execl可以使我的程序按预期完美运行。那么,当我使用execl时,这里出了什么问题,而系统函数却没有出现问题? #包括 #包括 #包括 内部主(空){ int-hInPipe[2]; 室内管道[2]; 文件*hInFile; 文件*hOutFile; char*s; 管道;

我正在尝试使用管道进行基本IPC。我花了几个小时在互联网上搜索,做这做那,阅读API文档,最后得到了下面的代码。但正如我所预料的那样,它不起作用。任何帮助我的代码“工作”都将非常感谢


我刚刚发现,使用
system
而不是
execl
可以使我的程序按预期完美运行。那么,当我使用
execl
时,这里出了什么问题,而
系统
函数却没有出现问题?

#包括
#包括
#包括
内部主(空){
int-hInPipe[2];
室内管道[2];
文件*hInFile;
文件*hOutFile;
char*s;
管道;
管道(喉管);
if(fork()){
关闭(hInPipe[0]);
关闭(小时管道[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);
免费的;
}否则{
dup2(hInPipe[0],标准文件号);
dup2(小时管道[1],标准管道文件号);
关闭(hInPipe[0]);
关闭(铰链管[1]);
关闭(小时管道[0]);
关闭(小时管道[1]);
系统(“bc-q”);/*这是可行的*/
/*execl(“bc”,“-q”,NULL);*//*但这不是*/
}
}
阅读精细手册页。:)

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

因此,您需要:

execl("/usr/bin/bc", "bc", "-q", NULL);
…或者,要搜索路径以查找
bc
,而不是硬编码位置:

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

简化问题。将
bc
替换为
cat
,将
fscanf
替换为
read
。并添加错误检查。此外,不要写入未初始化的指针,或释放它。什么是“它不工作,正如我所期望的那样”呢?到底发生了什么?你期待什么?@JohnBollinger我确实写了很多C语言,但我在这种编程方面几乎没有经验,与操作系统进行了深入的交互。我尝试过的示例代码几乎就是我现在需要实现的所有东西。在几个小时的混乱中,我想我答对了98%,但电脑不能容忍最后2%的失误。我只需要一个小的调整就可以完成我的解决方案。@williampersell那么我的程序哪部分出错了?那里的fscanf线路对我来说似乎没问题。我使用了
%ms
而不是
%s
,因此不会写入未初始化的指针。
execl("/usr/bin/bc", "bc", "-q", NULL);
execlp("bc", "bc", "-q", NULL);