我試圖從我的Linux C++程序中執行一個外部程序。如何在不等待退出的情況下運行外部程序?
我打電話給方法system("gedit")
來啓動Gedit編輯器的實例。但是我的問題是Gedit窗口打開時,我的C++程序等待它退出。
如何在不等待退出的情況下調用外部程序?
我試圖從我的Linux C++程序中執行一個外部程序。如何在不等待退出的情況下運行外部程序?
我打電話給方法system("gedit")
來啓動Gedit編輯器的實例。但是我的問題是Gedit窗口打開時,我的C++程序等待它退出。
如何在不等待退出的情況下調用外部程序?
您將需要使用fork
和exec
int fork_rv = fork();
if (fork_rv == 0)
{
// we're in the child
execl("/path/to/gedit", "gedit", 0);
// in case execl fails
_exit(1);
}
else if (fork_rv == -1)
{
// error could not fork
}
您還需要獲得您的孩子,以免留下殭屍進程。
void reap_child(int sig)
{
int status;
waitpid(-1, &status, WNOHANG);
}
int main()
{
signal(SIGCHLD, reap_child);
...
}
關於殭屍進程,你有第二種選擇。它使用了更多的資源(這種香味分叉兩次),但好處是你可以保持接近你的叉子,這在維護方面更好。
int fork_rv = fork();
if (fork_rv == 0)
{
fork_rv = fork();
if (fork_rv == 0)
{
// we're in the child
execl("/path/to/gedit", "gedit", 0);
// if execl fails
_exit(1);
}
else if (fork_rv == -1)
{
// fork fails
_exit(2);
}
_exit(0);
}
else if (fork_rv != -1)
{
// parent wait for the child (which will exit quickly)
int status;
waitpid(fork_rv, &status, 0);
}
else if (fork_rv == -1)
{
// error could not fork
}
這是什麼味道最後的作用是創建一個孩子,這又創建了一個孫子和孫子是什麼Exec的你的gedit程序。孩子本身就會離開,父母的過程可以馬上收穫。所以一個額外的叉子,但你把所有的代碼保存在一個地方。
感謝您的鏈接,我對fork的閱讀有了更好的理解。 – ace 2010-03-11 02:32:42
首先,您是否嘗試在system("gedit&")
的背景下啓動?
如果這不起作用,嘗試產生一個新的線程並從那裏運行gedit。
我認爲你不關心編輯的結果或編輯文件的內容?
剛剛嘗試過,效果很好。感謝您提供不同的方法。 – ace 2010-03-11 02:40:21
你能舉一個例子如何使用fork和exec一起調用gedit? – ace 2010-03-11 02:10:20
您應該在這裏使用'_exit'而不是'exit':否則最終會出現工件,例如由兩個不同的進程刷新相同的緩衝區。 – ephemient 2010-03-11 02:17:01
@ephemient - 謝謝,我已經解決了我的例子。 – 2010-03-11 02:21:19