2010-03-11 72 views
2

我試圖從我的Linux C++程序中執行一個外部程序。如何在不等待退出的情況下運行外部程序?

我打電話給方法system("gedit")來啓動Gedit編輯器的實例。但是我的問題是Gedit窗口打開時,我的C++程序等待它退出。

如何在不等待退出的情況下調用外部程序?

回答

11

您將需要使用forkexec

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程序。孩子本身就會離開,父母的過程可以馬上收穫。所以一個額外的叉子,但你把所有的代碼保存在一個地方。

+0

你能舉一個例子如何使用fork和exec一起調用gedit? – ace 2010-03-11 02:10:20

+0

您應該在這裏使用'_exit'而不是'exit':否則最終會出現工件,例如由兩個不同的進程刷新相同的緩衝區。 – ephemient 2010-03-11 02:17:01

+0

@ephemient - 謝謝,我已經解決了我的例子。 – 2010-03-11 02:21:19

1

首先,您是否嘗試在system("gedit&")的背景下啓動?

如果這不起作用,嘗試產生一個新的線程並從那裏運行gedit。

我認爲你不關心編輯的結果或編輯文件的內容?

+0

剛剛嘗試過,效果很好。感謝您提供不同的方法。 – ace 2010-03-11 02:40:21

相關問題