2016-04-23 18 views
0

請與我一起裸露,這個問題有一些設置。如何在ZSH中啓動`less`與啓動`cat`有什麼不同?關於使用備用屏幕和背景懸置

在我的操作系統上,默認情況下,ZSH有-tostop(或者是tty?)。

這允許後臺進程在輸出時輸出到shell。

因此:

> stty -tostop 
> echo 'random' >/tmp/random 
> cat /tmp/random & 
[1] 7588 
random 
[1] + 7588 done  cat /tmp/random 

相應:

> stty tostop 
> echo 'random' >/tmp/random 
> cat /tmp/random & 
[1] 3888 
[1] + 3888 suspended (tty output) cat /tmp/random 

閱讀此說明書和經驗中,我發現,ZSH有4種類型的掛起的進程(可以通過使用kill -$SIGNAL $PID ; jobs看到這一點)的:

job state    - signal that gives you job state 
suspended    - SIGTSTP 
suspended (signal)  - SIGSTOP 
suspended (tty input) - SIGTTIN 
suspended (tty output) - SIGTTOU 

這意味着3888進程正在接收SIGTTOU信號。

這一切都有道理。

現在我的問題是,爲什麼less不受stty tostopstty -tostop的影響?

> stty tostop 
> less /tmp/random & 
[1] 6300 
[1] + 6300 suspended (tty output) less --LONG-PROMPT --chop-long-lines /tmp/random 

> stty -tostop 
> less /tmp/random & 
[1] 4808 
[1] + 4808 suspended (tty output) less --LONG-PROMPT --chop-long-lines /tmp/random 

正如你可以在這兩種情況下看到,less總是被停用的背景。

現在,我知道less -X,我也知道終端仿真器具有的備用屏幕功能。 事實上,你可以用less -X運行上面的2個命令,並且它會導致相同類型的暫停。儘管-X使它不使用替代屏幕,但更少仍然得到suspended (tty output)

我想知道是如何less總是被停用與suspended (tty output),即使tostop是越來越切換,即使-X被觸發過的實際機制。除非有其他方式less被掛起,否則shell如何始終發送SIGTTOUless

+0

交替屏幕與'less'中的信號處理無關。 –

回答

1

(你沒有指定您的操作系統,但這個答案是基於Linux)

使用strace你可以看到stty在FD 0(標準輸入)中的termios的c_lflag值切換一位做一個ioctl結構。

strace還顯示,less將打開/dev/tty並在其上發出ioctl改變c_lflag

因此less只是在輸出任何東西之前做和stty tostop一樣的事情。

+0

我明白了。當你說「fd 0(stdin)」時,你指的是shell本身的stdin嗎?否則,你指的是哪個stdin?所以,當少打開一個文件時,它實際上會打開/ dev/tty將輸出發送到那裏,並且您也可以對其發出ioctl。少打開/ dev/tty時,是否連接到shell的stdin? – CMCDragonkai

+0

除非您重定向其輸入,否則shell的fd 0與子進程的fd 0相同。 '/ dev/tty'是進程的「控制終端」,所以大部分時間等於shell的fd 0,但是如果你將fd 0連接到一個文件(比如'less .profile/dev/null'),它會注意到(使用'isatty(1)',它會嘗試'ioctl()'it )並且不會打開'/ dev/tty'並忽略stdin。 (並表現爲「貓」) – mvds

+0

'strace'是你的朋友(在linux上) - 它顯示了所有的系統調用,因此顯示了與「外部世界」有關的所有過程。簡單地打開一個shell來完成你的'stty'和'less'實驗,並使用'strace -p PID -ff -o filename -s 10240 -v'或類似的命令從另一個終端跟蹤這個shell,這將會產生一個單獨的輸出文件爲每個子進程命名爲'filename.PID'。要查看進程的內部運作情況,請使用ltrace或調試器。 – mvds

相關問題