내가 아는 한, 프로세스가 중단되면 더 이상 출력이 반환되지 않습니다. 그러나 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
), 기본 작업이 프로세스를 종료하는 것인 신호가 많이 있습니다. kill
SIGTERM은 기본적으로 전송됩니다. SIGTERM은 SIGINT가 아닙니다. 둘 다 무시할 수 있습니다.SIGKILL은 포착, 차단 또는 무시될 수 없습니다., 그러나 이것이 최후의 수단이어야 합니다.
답변2
허용되는 답변 외에도 이것은 한 세션에서 실행되는 핑이었고 다른 세션에서는 다른 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.
전체 코드는 링크를 참조하세요.