簡體   English   中英

在C中實現類似Shell的作業控制

[英]Implementing shell-like job control in C

我試圖用C語言實現簡單的shell,而我卻很難實現工作控制。 網上的一切似乎都足夠復雜,我認為一些簡單性總會很好。 因此,讓我問一下...在調用fork()之后,我是否可以僅使用2個函數並使用pid處理Ctrl-Z信號?

我想在按Ctrl-Z時調用ex put_background(pid_t pid)函數,並使用pid = pid進行運行以運行背景,最后在我寫fg並希望使用pid時調用另一個函數ex put_foreground(pid_t pid) = pid再次轉到前景。

那么,這可能嗎? 任何幫助表示贊賞..更多代碼。

我試圖用C語言實現簡單的shell,而我卻很難實現工作控制。 網上的一切似乎都足夠復雜,我認為一些簡單性總會很好。

因此,讓我問一下...在調用fork()之后,我是否可以僅使用2個函數並使用pid處理Ctrl-Z信號?

請注意,Ctrl-Z主要對終端驅動程序有意義。 它會導致將SIGTSTP發送到在其中鍵入了該字符的終端的前台進程組-即,以該終端作為其控制端並有權從中讀取的進程組。 默認情況下,這將導致該組中的進程停止,僅此而已。 您無需執行任何操作即可實現該目標。 *

我想在按Ctrl-Z時調用ex put_background(pid_t pid)函數,並使用pid = pid進行運行以運行背景,最后在我寫fg並希望使用pid時調用另一個函數ex put_foreground(pid_t pid) = pid再次轉到前景。

根據定義和設計,最多一個過程組可以在任何特定時間控制給定的終端。 因此,要將前台作業移至后台,您要做的就是將另一份作業移至前台。 這可以是外殼本身,也可以是受其控制的其他作業。 tcsetpgrp()庫函數可以完成此任務。 除非它是外殼本身,否則您還希望將SIGCONT發送到該進程組,以防其停止。

您還需要一種機制來恢復已停止的后台作業,但這很簡單:只需向該進程組發送SIGCONT

那么,這可能嗎? 任何幫助表示贊賞..更多代碼。

可以肯定的是,您可以編寫一個將作業移至前台並恢復它的功能,以及一個用於恢復后台作業的功能。 這些功能所需的有關其操作的作業的唯一信息是它們的進程組ID(與它們的初始進程的進程ID相同)。

但是您還需要對當前的活躍工作進行一些記賬,並且需要謹慎地開始新工作,並且需要監視當前的工作(尤其是前台工作),以便能夠協調所有工作。適當的過渡。

GLIBC手冊有一整章有關作業控制 ,包括相當一部分專門介紹如何實現作業控制外殼。 即使您不編寫基於GLIBC的系統,這對您可能也會很有用。 所需的實際代碼並不十分復雜,但正確地編寫代碼需要對相當廣泛的概念有很好的理解。


*但是,您確實需要確保外殼程序將其啟動的命令放入與其自身不同的進程組中,否則Ctrl-Z也將其停止。

暫無
暫無

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

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