来自php执行c脚本的错误消息

来自php执行c脚本的错误消息,php,error-handling,segmentation-fault,exec,Php,Error Handling,Segmentation Fault,Exec,我花了几个小时调试一个php脚本,该脚本使用exec()运行c模拟。在到处抛出stderr print消息之后,我终于发现根本的问题是使用sprintf()将目录路径打印到一个过小的char数组 我猜这是一个分段错误,但我从来没有看到shell错误消息说“分段错误”。当我改变分配大小时,一切正常 我将stderr输出重定向到一个日志文件,该日志文件从fprintf(stderr,“…”)获取所有消息;但它没有收到任何shell错误消息 命令是这样的 exec("$cmd 2>> $l

我花了几个小时调试一个php脚本,该脚本使用exec()运行c模拟。在到处抛出stderr print消息之后,我终于发现根本的问题是使用sprintf()将目录路径打印到一个过小的char数组

我猜这是一个分段错误,但我从来没有看到shell错误消息说“分段错误”。当我改变分配大小时,一切正常

我将stderr输出重定向到一个日志文件,该日志文件从fprintf(stderr,“…”)获取所有消息;但它没有收到任何shell错误消息

命令是这样的

exec("$cmd 2>> $logFile & $PROCFILE 1 $ipaddr $! 2>> $logFile", $output, $rv);
$cmd运行c模拟,$PROCFILE运行第二个c程序,该程序使用三个参数(1、$ipaddr和$!)。在修复分配大小问题之前,php脚本将停止执行$cmd模拟并继续执行下一行(即exec()语句之后)。php文件中的下一行是

if(rv!=0){handle error}
但这也没有抓住问题所在

我一直认为我遇到了权限错误。如何让exec()显示shell错误?或者这是因为同时运行两个程序时使用了“&”?

当程序死机时,“分段错误”消息来自shell,而不是程序。重定向只适用于程序的输出,而不适用于shell的输出。消息应放入$output变量中。如果$rv为0,并且$output中没有任何内容,我怀疑您对发生的事情的看法是错误的。我建议您通过编写一个简单的测试程序来验证这一点,该程序只执行以下操作:

kill(0, SIGSEGV);

顺便说一句,你为什么不使用
snprintf()
,这样一开始就不会出现缓冲区溢出?

没有使用snprintf(),因为我很笨。我相当肯定问题是打印超出了字符数组的边界,因为加倍分配解决了这个问题。我认为$rv可能不是0,因为我同时执行了两个命令。你的意思是try exec(“kill(0,SIGSEGV)”)?不,我的意思是让$cmd中的程序成为一个简单的程序,只会因为一个分段错误而自动终止。