pingが終了しても出力が続くのはなぜですか?

pingが終了しても出力が続くのはなぜですか?

私が知っている限り、プロセスが中断された場合、出力は返されません。しかし、pingコマンドを削除した後は常に実行統計を取得することができ、私が知っている限り、それは出力の一部です。

amirreza@time:~$ ping 4.2.2.4
PING 4.2.2.4 (4.2.2.4) 56(84) bytes of data.
64 bytes from 4.2.2.4: icmp_seq=1 ttl=51 time=95.8 ms
64 bytes from 4.2.2.4: icmp_seq=2 ttl=51 time=92.3 ms
^C
--- 4.2.2.4 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 92.321/94.052/95.783/1.731 ms
amirreza@time:~$ 

どのように動作しますか?

答え1

Ctrl+C端末にSIGINTをフォアグラウンドプロセスグループに送信させます。 SIGINT を受け取るプロセスは何でも、シグナルを無視することもできます。 SIGINTに対する一般的な応答は、クリーンアップ後に正常に終了することです。

あなたのpingものは単にデザイン済みSIGINTの統計を印刷して終了します。

他のツールは SIGINT で終了または終了しない場合があります。たとえば、対話型シェルの一般的な動作(コマンドを実行しない場合)は、コマンドラインを消去してプロンプトを再描画することです。

SIGINT は、コマンドを終了するように設計された唯一の信号ではありません。ドキュメントを参照してください(man 7 signal)、基本操作がプロセスを終了するというシグナルがたくさんあります。killSIGTERM はデフォルトで送信されます。 SIGTERMはSIGINTではありません。どちらも無視できます。SIGKILLはキャプチャ、ブロック、または無視できません。しかし、これが最後の手段でなければなりません。

答え2

許可された答えに加えて、これはあるセッションで実行されるpingであり、別のセッションでは別のkillコマンドを実行しました。

server~ $ ping google.com
PING google.com (172.217.5.110) 56(84) bytes of data.
64 bytes from google.com(172.217.5.110): icmp_seq=1 ttl=111 time=1.68 ms
64 bytes from google.com(172.217.5.110): icmp_seq=2 ttl=111 time=1.73 ms
Terminated

上記は信号用語、これは信号15です。終了コードは143です。

server ~ $ ping google.com
PING google.com (172.217.5.110) 56(84) bytes of data.
64 bytes from google.com(172.217.5.110): icmp_seq=1 ttl=111 time=1.71 ms
64 bytes from google.com(172.217.5.110): icmp_seq=2 ttl=111 time=1.71 ms
Killed

これは信号を殺すつまり、信号9です。視覚的には同じように見えますが、テキストは異なります。今回は終了コードは137です。

server~ $ ping google.com
PING google.com (172.217.5.110) 56(84) bytes of data.
64 bytes from google.com(172.217.5.110): icmp_seq=1 ttl=111 time=1.69 ms
64 bytes from google.com(172.217.5.110): icmp_seq=2 ttl=111 time=1.70 ms
           **signal sent here**
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.697/1.701/1.705/0.004 ms

これは知能を知らせる信号2です。したがって、機能的にはaと同じです。^C奇妙なことに、終了コードは0です。これはほとんどのテストでは失敗ではなく成功します。

その結果、ping異なる信号に対して異なる操作が実行されます。

pingのソースファイルは次のように見えます。https://gist.github.com/kbaribeau/4495181どちらを参照するかhttps://ftp.arl.army.mil/~mike/ping.html オリジナルのように。

line
408     signal( SIGINT, finish );
409     signal(SIGALRM, catcher);

457     *           C A T C H E R
459     * This routine causes another PING to be transmitted, and then
460     * schedules another SIGALRM for 1 second from now.

完全なコードについてはリンクをご覧ください。

関連情報