我打电话:
FILE *fp = popen(cmd,"r");
...
fprintf(stderr,"%d\n",pclose(fp));
我是用CGI脚本调用的。
这曾经有用,但是最近正在运行的命令已经开始神秘失败,所以我添加了fprintf以查看pclose()返回的状态代码,我很惊讶地发现它是32512,这对应于退出代码os 127.我已经验证该命令实际上没有运行,返回值对应于退出状态127.
我尝试在正在运行的二进制文件上运行otool -L
,一切看起来都很好。我正在使用命令的完整路径调用该命令,因此没有任何更改它找不到可执行文件。我打印了当前目录,以确保我认为我在哪里,并确认二进制文件是可见的。
如果我运行与CGI运行相同的用户登录的完全相同的命令,因为它工作正常。如果我通过将它传递给system()
来运行完全相同的命令,它也适用于那里!它只在我尝试通过popen()
运行时失败。
这个命令似乎并不重要!我用其他命令替换它,例如ls
,我仍然得到这个奇怪的退出代码。
我的事情已经不多了。还有什么呢?
答案 0 :(得分:0)
如果将来有人遇到这个问题,我就是这样解决的。之前在代码中调用了popen()
,对代码的审核表明它被fclose()
而不是pclose()
错误地关闭了。由于之前的popen调用被不正确地关闭,因此阻止了将来的调用正常工作。
答案 1 :(得分:0)
就我而言,我正在终端(zsh)和C命令执行外壳(bash)上运行不同的外壳。
我正在运行的命令是在默认终端外壳程序中设置的别名,并且没有显示在C命令执行外壳程序中。
我要做的就是现在将别名添加到.bashrc
并解决了该错误。
使用命令echo $0
确认相应的活动外壳