1

私は次のようなbashスクリプトからインタラクティブなbashをフォークしようとしています:

#!/bin/bash
bash -c 'bash -i -l' &

上記のスクリプトプロセスを実行した後、「bash -i -l」は100%のCPU使用率に達します。そのような行動の理由は何ですか?

私はこれをFedora16でテストしています。

ありがとう。

4

1 に答える 1

2

興味深い質問です。これは実行と同等であることに注意してください。

bash -c "bash -c 'bash -i -l' &"

コマンドプロンプトで。実行しただけでも同じ結果が得られました。

bash -c "bash -i &"

何が起こっているのかはかなり確かですが、Bashは(インタラクティブにしようとしているため)制御端末にアクセスしようとしてポーリングしていますが、許可されていません(バックグラウンドプロセスのため)。走ってみbash -c 'strace -o bash_trace.txt bash -i &'ました。これをループで実行します。

...
    rt_sigaction(SIGTTIN, {SIG_DFL, [], 0}, {SIG_IGN, [], 0}, 8) = 0
kill(0, SIGTTIN)                        = 0
--- SIGTTIN (Stopped (tty input)) @ 0 (0) ---
rt_sigaction(SIGTTIN, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
ioctl(255, TIOCGPGRP, [9964])           = 0
rt_sigaction(SIGTTIN, {SIG_DFL, [], 0}, {SIG_IGN, [], 0}, 8) = 0
kill(0, SIGTTIN)                        = 0
--- SIGTTIN (Stopped (tty input)) @ 0 (0) ---
rt_sigaction(SIGTTIN, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
ioctl(255, TIOCGPGRP, [9964])           = 0
rt_sigaction(SIGTTIN, {SIG_DFL, [], 0}, {SIG_IGN, [], 0}, 8) = 0
kill(0, SIGTTIN)                        = 0
--- SIGTTIN (Stopped (tty input)) @ 0 (0) ---
...

プロセスは、制御端末にアクセスしようとするとSIGTTINを取得しますが、バックグラウンドで実行されます-http ://www.lindevdoc.org/wiki/SIGTTIN。このように回転する正しい動作かどうかはわかりません。

于 2013-02-17T14:03:27.567 に答える