在Linux上,我有一些C++代碼,我想要執行另一個應用程序。該程序輸出一些數據到stderr。因此,我通過調用fredern()與stderr作爲流參數來重定向stderr。問題是,我想將stderr重定向到正在運行的另一個進程。execv調用後打開文件句柄會發生什麼? (C++)
這是我正在使用的場景。我fork()當前進程;在子進程中,我重定向stderr;然後我execv()運行單獨的應用程序。
首先,我有一個Sentry設置爲重定向stderr輸出。下面是代碼:
class StderrSentry {
public:
StderrSentry() {
freopen("NUL", "wt", stderr);
}
~StderrSentry() {
fclose(stderr);
}
};
然後在後面的代碼:
pid_t pid = fork();
int retval=-1;
if(pid < 0) {
success = false;
}
else if(! pid) { // child process
StderrSentry stdErrSentry; // REDIRECTING STDERR HERE!
pid_t chid = setsid();
if (chid == -1) {
exit(-1);
}
else {
// HERE IS THE execv() call:
if(execv(command[0].c_str(), const_cast<char**>(&c_args[0])) < 0) {
exit(-1);
}
}
}
// ... else etc...
將標準錯誤重定向其實還是在技術上是有效的,一旦execv()調用與指定的一個替換當前的進程?
這實際上表現得像我的願望,但這是一種僥倖,還是這樣做的方式?
我無法激活在execv中運行的應用程序中的stderr重定向,因爲它不是我的代碼。
感謝您對此的任何信息。
感謝所有人的答覆 - 他們都可以標記爲'答案'。這有助於我對此代碼充滿信心,因爲它很快就會發布。再次感謝。 – Raymond 2010-09-28 19:13:26
這可能不適用於所有類型的描述符。如果這些標記爲O_CLOEXEC標誌,調用execv將使它們關閉。 – codewarrior 2013-11-06 18:47:11