我花了几个小时试图调试一个使用 exec() 运行 ac 模拟的 php 脚本。在到处抛出 stderr 打印消息后,我终于发现根本问题是使用 sprintf() 将目录路径打印到一个太小的 char 数组。
我猜这是一个分段错误,但我从未真正看到 shell 错误消息说“分段错误”。当我更改分配大小时,一切正常。
我一直在将 stderr 输出重定向到一个日志文件,并且该日志文件从 fprintf(stderr,"..."); 获取了所有消息。但它没有收到任何 shell 错误消息。
命令是这样的
exec("$cmd 2>> $logFile & $PROCFILE 1 $ipaddr $! 2>> $logFile", $output, $rv);
$cmd 运行 ac 模拟,$PROCFILE 运行第二个 c 程序,它接受三个参数(1、$ipaddr 和 $!)。在我修复分配大小问题之前,php 脚本将停止执行 $cmd 模拟并继续下一行(即在 exec() 语句之后)。php 文件的下一行是
if(rv!=0){handle error}
但这也没有解决问题。
我一直在想我遇到了权限错误。如何让 exec() 显示 shell 错误?或者这是用'&'同时运行两个程序的结果?