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

Why pclose() return 32512 (exit code 127) when system() succeeds on identical command?

我打电话给:

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

我是从 CGI 脚本中调用它的。

这曾经有效,但最近命令 运行 开始神秘地失败,所以我添加了 fprintf 以查看状态代码 pclose() 是什么returning,我很惊讶地看到它是 32512,它对应于退出代码 os 127。我已经验证该命令实际上不是 运行,并且 return值对应退出状态127.

我在二进制 运行 上尝试了 运行ning otool -L,一切看起来都很好。我正在使用命令的完整路径调用命令,因此没有找到可执行文件的变化。我打印了当前目录以确保我在我认为我所在的位置,并验证了二进制文件可见。

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

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

我运行没有什么可以尝试的了。还能是什么?

万一以后有人遇到这个问题,以下是我的解决方法。之前在代码中调用了 popen(),代码审查表明它被错误地用 fclose() 而不是 pclose() 关闭。由于之前的 popen 调用未正确关闭,它阻止了以后的调用正常工作。

就我而言,我在终端 (zsh) 和 C 命令执行上 运行 不同 shells shell(bash).

我使用的命令 运行 是在默认终端 shell 中设置的别名,并没有出现在 C 命令执行中 shell。

我现在所做的就是将别名添加到 .bashrc 并修复了错误。

使用命令echo [=11=]

确认相应的活动shells