我花了數小時試圖調試一個使用exec()運行c模擬的php腳本。在將stderr打印消息放到任何地方後,我終於發現底層問題是使用sprintf()將打印目錄路徑打印到字符數組太小。來自php執行c腳本的錯誤消息
我猜這是段錯誤,但我從來沒有看到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錯誤?或者這是與'&'同時運行這兩個程序的結果?
沒有使用snprintf(),因爲我很蠢。我相當確定問題是打印超出了字符數組的邊界,因爲加倍分配修復了問題。我想$ rv可能不是0,因爲我同時執行兩個命令。你的意思是嘗試exec(「kill(0,SIGSEGV)」)? – jroz 2012-08-12 06:37:43
不,我的意思是讓$ cmd中的程序成爲一個簡單的程序,它只是用分段錯誤自殺。 – Barmar 2012-08-13 15:00:32