參考文獻
作業控制是bsd在2023年前後增加的乙個特性。
它允許在乙個終端上啟動多個作業(程序組),它支援控制哪乙個作業可以訪問終端,以及哪些作業可以在後台執行。
作業可以看做是shell管理的程序主要有三點:
支援作業控制的shell
核心中的終端驅動程式必須支援作業控制
核心必須提供對某些作業控制訊號的支援
從shell使用作業控制功能角度講,使用者可以在前台或後台啟動乙個作業。
如以下命令:
$ vim main.c
就會在前台啟動只有乙個程序組成的作用。
$ pr *c | lpr &
$ make all &
在後台啟動了兩個作業,這兩個作業呼叫的所有程序都在後台執行。
當啟動乙個後台作業時,shell賦予它乙個作業標識,並列印乙個或幾個程序的id。
$ make all > make.out &[1
]1475
$ pr *c | lpr &[2
]1490
$ (鍵入回車)[2
]+ done pr *c | lpr &[1
]+ done make all > make.out &
make的作業號是1,啟動的程序id是1475.下乙個管道線是作業號2,其第乙個程序的程序id是1490。
當我們作業完成並且鍵入回車時,shell通知我們作業已完成並列印其提示符。
shell並不在任何隨意時刻列印後台作業的狀態改變,它只在列印其提示符讓使用者輸入新的命令列之前才這樣做。我們可以依靠掛起鍵
ctrl+z
來影響前台作業。
鍵入此字元使終端驅動程式將訊號sigtstp
送至前台程序組中的所有程序,後台作業則不受影響。
以下三個特殊字元可使終端驅動程式產生訊號,並將其送至前台:
當我們有乙個前台作業以及或若干個後台作業時,是哪乙個接受我們在終端上鍵入的字元呢?
只有前台作業接收終端輸入!
但是!後台作業試圖讀取終端也不是乙個錯誤,終端驅動程式將會檢測到這種情況,並且向後台作業試圖讀終端傳送乙個訊號sigttin
,該訊號會暫停此後台作業。
當然,使用者可以用shell命令將此作業轉為前台作業執行。
$ car > temp.foo &
//在後台啟動,但是從標準輸入讀[1
]1681
$ (enter)[1
]+stopped
(sigttin)
//cat > temp.foo &
$ fd %
1//1號作業成為前台作業
cat > temp.foo
hello world //輸入hello world
^d //輸入檔案結束符
$ cat temp.foo
hello world
後台作業輸出到終端是乙個我們可以允許或禁止的選項,通常用stty
命令。
$ cat temp.foo &[1
]1719
$ hello world
(enter)[1
]+ done
$ stty tostop //禁止後台作業輸出至控制終端
$ cat temp.foo &[1
]1721
$ (enter)[1
]+stopped
(sigttou) cat temp.foo &
$ fg %
1cat temp.foo
hello world
[1] unix環境高階程式設計(第二版)
Linux作業控制
在linux中,利用shell的作業控制是比較常用的操作,在這一節中我們將 作業控制相關的操作。為了方便我們檢視區分不同的進行,我們編寫如下程式,其功能是每間隔2秒輸出一次自己的編號。1 2 test puting a running program into backgound3 4 includ...
Linux的作業控制
作業 jobs,在命令列執行或者是通過系統啟動時執行的乙個程式,但要注意的是,執行乙個指令碼的時候,可能會啟動多個程序,所以作業和程序不是一一對應的。作業包括乙個或多個程序,它主要是完成一系列複雜的任務或者乙個完整任務的一組程式或程序。前台作業 通過終端啟動,且啟動後一直佔據終端 後台作業 可以通過...
Linux中作業控制命令
開門見山,最近.net勸退師要在linux上寫些長時間執行的指令碼,獲取azure blobstorage儲存的資料。記錄一下linux中後台執行作業的命令。作業 job 是shell管理的程序 每個job都有乙個關聯的pid 每個作業會被分配乙個線性job id。有兩種形式的作業 foregrou...