2010-07-06 2 views
0

는 내가 자바 프로그램을 시작하면 이상한 시나리오를 발견하고 난에있는, 그것은/응답을 작동하지 않습니다 CTRL + C로 우아하게 종료 할 CTRL + Z이 프로그램에 나와 있는데 이것은 멋지지 않습니다. ps는 프로세스를 나열합니다. 아무나 할 수 있습니다.CTRL-C는 Java 프로그램에서 작동하지 않습니다

+0

몇 가지 코드를 게시 할 수 있습니까? –

답변

3

유닉스에서는 명령 줄 프로그램이 ^C으로 인터럽트하려고 할 때 어떤 일이 일어나는지보다 많은 제어를합니다. 터미널에 ^C을 타이핑 할 때의 기본 효과는 커널이 SIGINT 신호를 포 그라운드 프로세스 그룹에 보내도록하고, 기본 동작 인 SIGINT은 전송 된 프로세스를 죽이는 것이지만, 둘 모두 변경 될 수 있습니다.

문제의 가장 큰 원인은 Java 프로그램이 종료 전에 일부 정리를 수행하기 위해 SIGINT을 가로 채고 있지만 신호 처리기가 버그가있어 프로세스가 실제로 종료하지 않는다는 것입니다. 두 번째로 가장 큰 원인은 SIGINT을 모두 무시한다는 것입니다. 그리고 가장 가능성이 낮은 원인은 터미널을 "원시 모드"로 설정하여 ^C이 값 0x03을 가진 바이트를 표준 입력으로 전달하는 것입니다 (수행 한 경우 ^Z도 아마 작동하지 않습니다).

프로그램의 소스 코드에 액세스 할 수있는 경우 버그가있는 신호 처리기를 수정하거나 신호 무시를 중지 할 수 있습니다. 그렇지 않으면, 당신은 일종의 크릭입니다. 정상 치명적인 신호 (SIGQUIT)를 전송하는 ^\ (제어 백 슬래시)을 시도해 볼 수는 있지만 작동하지 않을 수도 있으며 작동하지 않을 경우 거대한 "코어 덤프" 파일을 제거하십시오.

오작동하는 프로세스를 없애는 확실한 방법은 신호 9 (SIGKILL) 만 보내는 것입니다. 다른 치명적인 신호와는 달리, 그 신호를 가로 채거나 차단하거나 무시하는 것은 불가능합니다. 신호 9를 보낼 제어 키가 없습니다. ^Z으로 프로세스를 일시 중지하거나 새 터미널 창/ssh 세션을 열고 ps으로 프로세스 ID를 찾고 kill 명령을 사용해야합니다. 항상 kill PIDkill -9 PID 앞에 시도하십시오.

관련 문제