Ctrl + D ASCIIテーブルのEOTにマップします。多くの場合(ほとんどの場合)、これはEOFにマップされます。これは、データがもうないことを意味します。
端末用(例えば bash
としてttyで実行 stdin
)、呼び出し read()
ユーザー入力がない場合、通常はブロックされるか、ゼロを返します(読み取るデータがない)。ときにtty」 消えます "、 bash
最後にEOFを読んで、これまでのところ、これ以上の入力はありません。次のように入力してEOFを手動で提示できます。 Ctrl + D 。
それは物事が好きであることに注目する価値があります bash
その用途 readline
現在の行が空でない限り、EOFを表示しません。何かを入力してからを押してみてください Ctrl + D - 何も起こりません。
いつ bash
入力としてスクリプトを使用して実行されます(例: stdin
最後のバイトが読み込まれると、 read()
EOFを返します。この時点でスクリプトは完成しています。 bash
終了します。これは端末と同じ動作です。
プロセスをバックグラウンドで実行した場合(コマンドを終了するには &
または使用 Ctrl + Z そして bg
その後、あなたはシェルに戻ります。この時点でシェルを殺すことは、それが何をするかに応じて、プロセスに異なる影響を与えます。
- ファイルとしてのプロセス
stdin
init(PID 1)によって継承されるようになりました。
- からパイプを持つプロセス
bash
として stdin
実行も継続されます... まで 電話しよう read()
。この時点で、 read()
失敗し、アプリケーションはエラーを吸収して続行するか、(おそらく)エラーで終了します。
SIGHUP
(別名ハングアップ)は、相手側が「ハングアップ」したことをプロセスに知らせるためにプロセスに与えられるシグナルです。これは難解な概念かもしれませんが、この使用法では、SSHクライアントが切断したことをプロセスに通知するか、または子供に通知します。 bash
それ bash
などを終了しました...
プロセスが明示的に処理しない場合 SIGHUP
その後、デフォルトのアクションはそれを終了することです。したがって尋ねる bash
しない 送る SIGHUP
その子供たちの一人にシェルが去った後に効果的にそれを実行することができます。
最初に土台を置かずにコマンドをバックグラウンドで実行したままにする場合 tmux
のより良いバージョンとして screen
)その後、あなたは具体的に述べる必要があります」 このプロセスをこのシェルにアタッチしたくない "
これを達成するために、あなたは使うことができます disown
( ここに参照 しかし、あなたは検索/スクロールする必要があるでしょう)。
disown [-ar] [-h] [jobspec ...]
オプションを指定しないと、各jobspecはアクティブジョブのテーブルから削除されます。 jobspecが存在せず、-aも-rも指定されていない場合は、シェルの現在のジョブの概念が使用されます。 -hオプションを指定すると、各jobspecはテーブルから削除されませんが、シェルがSIGHUPを受け取った場合にSIGHUPがジョブに送信されないようにマークされます。 jobspecが存在せず、-aオプションも-rオプションも指定されていない場合は、現在のジョブが使用されます。 jobspecが指定されていない場合、-aオプションはすべてのジョブを削除またはマークすることを意味します。 jobspec引数を指定せずに-rオプションを指定すると、実行中のジョブに操作が制限されます。 jobspecで有効なジョブが指定されていない限り、戻り値は0です。
プロセスがしようとすると物事はまだおそらくうまくいかないでしょう read()
から stdin
したがって、実行中のプロセスを明示的に切断したい場合は、次のどちらかを確認してください。 stdin
指している /dev/null
または同様、または使用 tmux
前もって。
注:への書き込み stdout
または stderr
から読み込もうとするのと同じくらい致命的になるでしょう stdin
このような場合は... SIGPIPE ahoy。
リダイレクトするツールを使って可能です。 stdin
、 stdout
、 stderr
デバッグシステムコールを使用することで、実行中のプロセスを終了させることがはるかに安全になります。 この )私が過去に使用したCアプリケーションの名前を覚えているのに苦労していますが、ちょっとした騒ぎが現れました dupx
これも役に立つかもしれませんし、少なくとも検討するのが面白いかもしれません。
どちらも、ターゲットプロセス内で基本的に次のことを行うことによって動作します。
fd = open("/dev/null", O_RDONLY);
dup2(fd, stdin);
close(fd);
fd = open("/dev/null", O_WRONLY);
dup2(fd, stdout);
dup2(fd, stderr);
close(fd);