我在打电话:
FILE *fp = popen(cmd,"r"); ... fprintf(stderr,"%d\n",pclose(fp));
我正在从CGI脚本中调用它。
这曾经起作用,但是最近正在运行的命令开始神秘地失败,因此我添加了fprintf来查看返回的状态代码pclose(),我很惊讶地看到它是32512,它对应于退出代码os127。我已验证该命令实际上并未在运行,并且返回值对应于退出状态127。
我尝试在正在运行的二进制文件上运行otool -L
,一切看起来都很好。我正在使用命令的完整路径来调用命令,因此没有任何变化,即找不到可执行文件。我已经打印了当前目录,以确保我在我想的位置,并已验证该二进制文件是可见的。
如果我以与CGI运行相同的用户身份登录,则运行完全相同的命令,因为它运行正常。如果我通过将其传递给system()
来运行完全相同的命令,那么它也可以在这里运行!仅当我尝试通过popen()
运行它时,它才会失败。
命令是什至没有关系!我用其他命令替换了它,例如ls
,但仍然得到这个奇怪的退出代码。
我没办法尝试了。还有什么呢?
我正在打电话:FILE * fp = popen(cmd,“ r”); ... fprintf(stderr,“%d \ n”,pclose(fp));我是从CGI脚本调用的。这曾经可以工作,但是最近正在运行的命令已经开始神秘地...
以防将来有人遇到此问题,这是我解决的方法。该代码中先前有一个对popen()
的调用,对代码的检查表明它被fclose()
而不是pclose()
错误地关闭了。因为先前的popen调用未正确关闭,所以它阻止了以后的调用正常工作。
就我而言,我正在终端(zsh)和C命令执行外壳(bash)上运行不同的外壳。