簡體   English   中英

將進程發送到后台並將控制權返回給我的shell

[英]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()適用於進程組 ,而不適用於單個進程。 你想要做的是:

  1. 創建新管道時,調用setpgid()將管道的所有成員放入新的進程組(管道中第一個進程的PID作為PGID)。 (管道是shell在看到像ls | grep foo | wc -l這樣的請求時啟動的一系列進程 - 最簡單的管道中只有一個進程)。 通常,在調用exec()之前setpgid(0, 0)您將從管道中的第一個進程調用setpgid(0, 0) exec()

  2. 使用tcsetpgrp()來管理前台中的哪個進程組。 如果將進程組從前台移動到后台,則可以將shell自己的進程組設置為前台進程組 - 您可以在shell中使用getpgid(0)獲取此進程組。

  3. 當shell在后台時,它應該使用阻塞的waitpid()調用來等待子進程退出而不是顯示提示。 一旦前台管道中的每個進程都退出,它應該將自己重新置於前台(並顯示提示)。

  4. 當shell位於前台時,它應該使用WNOHANGWUNTRACED標志調用waitpid()以在顯示提示之前檢查子進程的狀態 - 這將在它們停止或退出時通知您,並讓您通知用戶。

你應該看一下fork來創建子進程。 然后,在子exec中使用exec來運行所需的命令。

如果你的shell使用&來啟動一個進程,那么$! shell變量將包含子進程的PID。 然后,您可以向該過程發送信號,或使用wait $! 等待它完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM