为什么当system()在相同的命令上成功时,pclose()返回32512(退出代码127)?

时间:2016-02-11 06:10:23

标签: macos cgi popen

我打电话:

FILE *fp = popen(cmd,"r");
...
fprintf(stderr,"%d\n",pclose(fp));

我是用CGI脚本调用的。

这曾经有用,但是最近正在运行的命令已经开始神秘失败,所以我添加了fprintf以查看pclose()返回的状态代码,我很惊讶地发现它是32512,这对应于退出代码os 127.我已经验证该命令实际上没有运行,返回值对应于退出状态127.

我尝试在正在运行的二进制文件上运行otool -L,一切看起来都很好。我正在使用命令的完整路径调用该命令,因此没有任何更改它找不到可执行文件。我打印了当前目录,以确保我认为我在哪里,并确认二进制文件是可见的。

如果我运行与CGI运行相同的用户登录的完全相同的命令,因为它工作正常。如果我通过将它传递给system()来运行完全相同的命令,它也适用于那里!它只在我尝试通过popen()运行时失败。

这个命令似乎并不重要!我用其他命令替换它,例如ls,我仍然得到这个奇怪的退出代码。

我的事情已经不多了。还有什么呢?

2 个答案:

答案 0 :(得分:0)

如果将来有人遇到这个问题,我就是这样解决的。之前在代码中调用了popen(),对代码的审核表明它被fclose()而不是pclose()错误地关闭了。由于之前的popen调用被不正确地关闭,因此阻止了将来的调用正常工作。

答案 1 :(得分:0)

就我而言,我正在终端(zsh)和C命令执行外壳(bash)上运行不同的外壳。

我正在运行的命令是在默认终端外壳程序中设置的别名,并且没有显示在C命令执行外壳程序中。

我要做的就是现在将别名添加到.bashrc并解决了该错误。

使用命令echo $0确认相应的活动外壳