2011-04-26 103 views
2

如果我使用fork()和execv()來產生在後臺運行的多個子進程,並且我想將其中一個進入前臺,我怎麼能去做?如何將子進程在後臺運行到前臺

我正試圖編寫一個可以在前臺或後臺啓動進程的shell。

回答

4

「背景」和「前景」不是一般用於過程的術語,而是僅適用於可按需等待工作的殼。

+0

+1這是正確的。 「前臺」進程是接收標準輸入並寫入標準輸出/標準錯誤的進程。操作系統本身沒有這個概念。 – Borealid 2011-04-26 04:46:29

+1

收到stdin。即使後臺進程可以寫入標準輸出和標準錯誤。 – 2011-04-26 04:48:35

+0

值得一提的是,如果原始海報意味着他們需要父母在特定孩子結束之前停止做任何事情,他們只需要'waitpid(2)'就可以了。 – 2011-04-26 06:28:54

1

您可以使用fg將過程帶到前臺,並使bg將過程置於背景。你應該知道這個過程的PID,以便將它帶到前臺。參考fg和bg的linux手冊瞭解更多信息

4

Ignacio Vazquez-Abram's answer相似,我建議你模擬shell前景/背景模型。

據我所知,背景處理意味着掛起它。最簡單的方法是通過SIGSTOP。當你前臺處理時,發送它SIGCONT。只要您的「工作」當前只有一個在前臺,它將是唯一一個讀取和寫入會話的tty

kill(child_pid, SIGSTOP); 
kill(child_pid, SIGCONT); 

您可能希望以後你fork暫停每個進程,在你面前execv,並給你的shell的用戶選擇稍後前景他們保持不變。

if (!fork()) { // we are the child 
    raise(SIGSTOP); // suspend self 
    execv(...); // run the command (after we've been resumed) 

這裏是我發現一些相關鏈接:

+0

我不認爲在後臺運行程序意味着掛起它。這意味着程序運行父級運行時。 – 2011-04-29 21:02:55

+0

當涉及到程序(過程)時,沒有前景或背景的概念。這是一個外殼的概念。有關這方面的更多信息,請參閱Ignacio Vazquez-Abrams的答案。 – 2011-04-30 12:08:44