我試圖追查一個非常奇怪的崩潰。奇怪的是有人發現了一個解決方法,我無法解釋。exec如何改變exec'ed程序的行爲
的解決方法是這樣的小程序,我稱之爲「轉輪」:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
if (argc == 1)
{
fprintf(stderr, "Usage: %s prog [args ...]\n", argv[0]);
return 1;
}
execvp(argv[1], argv + 1);
fprintf(stderr, "execv failed: %s\n", strerror(errno));
// If exec returns because the program is not found or we
// don't have the appropriate permission
return 255;
}
正如你所看到的,這一切的程序做的是使用execvp
用不同的方案來取代自己。
程序崩潰時,它是直接在命令行調用:
/path/to/prog args # this crashes
但是當它被間接地通過我的亞軍墊片調用工作正常:
/path/to/runner /path/to/prog args # works successfully
對於我的生活,我可以弄清楚如何讓一個額外的exec可以改變正在運行的程序的行爲(正如你所看到的程序不會改變環境)。
關於崩潰的一些背景知識。崩潰本身發生在C++運行時。特別是,當程序執行throw
時,崩潰版本錯誤地認爲沒有匹配的catch(雖然有)並調用terminate
。當我通過跑步者調用程序時,異常被正確捕捉。
我的問題是任何想法爲什麼額外的EXEC會改變exec'ed程序的行爲?
我不知道:但是execvp會改變工作目錄嗎?你傳遞了什麼論點? – 2010-03-22 20:22:12
@MartinYork - AFAIK,'execvp'永遠不會改變工作目錄(這需要調用'chdir',而runner不會這麼做)。具體的論點是不相關的;所描述的行爲與傳遞給程序的特定參數無關。 – 2010-03-22 20:39:23
如果您使用'execv()'而不是'execvp()'做同樣的事情嗎? – caf 2010-03-23 01:47:55