コマンドラインシェルのマニアックな比較 その 2
echo `cat` とやってから特殊文字 susp で SIGTSTP シグナルを送って cat を止めようとするとどうなるか試してみた。
- bash
- 何も起こらない。cat は停止しない。
- tcsh
- 何も起こらない。cat は停止しない。
- zsh
- 何も起こらない。cat は停止しない。
- ksh
- 無限 fork 発生。危うくシステムを強制終了させなければならなくなるところだった。
停止しない
とは書いたものの、停止した直後にシェルが cat を再開させているのか、それとも最初から cat が SIGTSTP を受け付けないようになっているのかは定かではない。
ksh では、cat は組込みコマンドなので cat は元のシェル内で実行される。({ba,tc,z}sh では cat は分岐した子プロセスとして実行される) よって単に ksh で cat を実行しただけでは分岐は起きず、SIGTSTP で停止させようとしたときに初めて分岐して子プロセスが停止する。どうもこの ksh における cat の特殊な動作が悪いのではないかと思って、今度は echo `/bin/cat` を試してみた (これなら必ず組込みコマンドではなく外部コマンドが子プロセスで起動する) が、これでも無限 fork が発生した。
| 固定リンク
コメント