next up previous
Next: 為什麼在 Bourne shell 當中,對迴圈的輸出入轉向無法達到預期的效果? Up: 中級的問題 Previous: 我要如何 "undelete" 一個檔案?

一個 process 要怎樣偵測出自己是否在背景狀態執行?

首先,您是否想知道您自己是在背景狀態下執行,或者在交談狀態下執行?如果 您只是想藉此決定是否該在終端機上印出提示符號之類的訊息,那麼更合適的做 法應該是檢查您的標準輸入是否為終端機:

sh: if [ -t 0 ]; then ... fi C: if(isatty(0)) ...

一般來說,您無法得知自己是否在背景狀態下執行。問題的根本在於不同的 shell 與不同的 UNIX 版本對於「前景」與「背景」的定義可能有所不同。而且在最 常見的系統上,前景與背景都有較好的定義,程式甚至可以在背景與前景之間任 意切換!

在沒有 job control 的 UNIX系統上,若要把 process 放入背景狀態通常是把  SIGINT 與 SIGQUIT 忽略掉,並且把標準輸入轉為 "/dev/null",這是由  shell處理的。

在具有 job control 功能的 UNIX 系統,若shell支援 job control 功能,那麼shell 只要把 process group ID 設成跟 terminal 所屬的 PGID 不同即可把 process 切 換至背景狀態;如果要把 process 切回前景狀態,只要把此 process 的 PGID 設 成跟目前 terminal 所屬的 PGID 即可。如果 shell 不支援 job control 功能,則 不管UNIX 系統是否支援 job control 的功能,shell 對 process 的處理動作都 是一樣的(也就是忽略SIGINT 與 SIGQUIT,並且把標準輸入轉為"/dev/null")。



Tan Koan-Sin
1999-03-02