【问题标题】:Error message from php executing c script来自 php 执行 c 脚本的错误消息
【发布时间】:2012-08-12 04:10:27
【问题描述】:

我花了几个小时试图调试一个使用 exec() 运行 c 模拟的 php 脚本。在到处抛出 stderr 打印消息后,我终于发现根本问题是使用 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 错误?或者这是用'&'同时运行两个程序的结果?

【问题讨论】:

    标签: php error-handling segmentation-fault exec


    【解决方案1】:

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

    kill(0, SIGSEGV);
    

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

    【讨论】:

    • 没有使用 snprintf() 因为我很愚蠢。我相当确定问题是打印超出了 char 数组的边界,因为将分配加倍解决了问题。我在想 $rv 可能不是 0,因为我同时执行了两个命令。你的意思是尝试 exec("kill(0,SIGSEGV)")?
    • 不,我的意思是让 $cmd 中的程序成为一个简单的程序,它只会因分段错误而导致自身死亡。
    猜你喜欢
    • 2011-01-19
    • 2021-07-30
    • 2011-02-10
    • 2013-05-13
    • 2014-06-02
    • 2019-02-04
    • 2023-03-19
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多