[英]Sending a process to the background and returning control to my shell
我正在為我的CS類編寫一個shell,項目的一部分涉及如果用戶傳入'&'字符,則在后台運行一個進程。
如果一個進程在前台運行,我簡單execvp
過程,因為它是在前景它保持在該終端的控制。 但是,如果它是后台進程,我必須在開始執行進程后將控制權返回給我的主shell。 我知道系統調用tcsetpgrp(pid_t)
將進程作為參數傳遞給前台,但我不太明白如何使用它。
如果是后台進程,我應該在execvp
之后調用tcsetpgrp
嗎? 如果是這樣,我可以通過調用getpid
來獲取shell的pid嗎?
tcsetpgrp()
適用於進程組 ,而不適用於單個進程。 你想要做的是:
創建新管道時,調用setpgid()
將管道的所有成員放入新的進程組(管道中第一個進程的PID作為PGID)。 (管道是shell在看到像ls | grep foo | wc -l
這樣的請求時啟動的一系列進程 - 最簡單的管道中只有一個進程)。 通常,在調用exec()
之前setpgid(0, 0)
您將從管道中的第一個進程調用setpgid(0, 0)
exec()
。
使用tcsetpgrp()
來管理前台中的哪個進程組。 如果將進程組從前台移動到后台,則可以將shell自己的進程組設置為前台進程組 - 您可以在shell中使用getpgid(0)
獲取此進程組。
當shell在后台時,它應該使用阻塞的waitpid()
調用來等待子進程退出而不是顯示提示。 一旦前台管道中的每個進程都退出,它應該將自己重新置於前台(並顯示提示)。
當shell位於前台時,它應該使用WNOHANG
和WUNTRACED
標志調用waitpid()
以在顯示提示之前檢查子進程的狀態 - 這將在它們停止或退出時通知您,並讓您通知用戶。
你應該看一下fork來創建子進程。 然后,在子exec
中使用exec
來運行所需的命令。
如果你的shell使用&
來啟動一個進程,那么$!
shell變量將包含子進程的PID。 然后,您可以向該過程發送信號,或使用wait $!
等待它完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.