XUbuntu에서 GUI 창이 있는 프로그램이 정지되면 "이 창이 사용 중이거나 응답하지 않을 수 있습니다. 응용 프로그램을 종료하시겠습니까?"라는 경고가 표시될 수 있습니다.
종료를 클릭하면 프로그램에 어떤 신호가 전송됩니까? 응답하지 않는 프로세스에만 전송됩니까, 아니면 모든 하위 프로세스, 스레드 또는 하위 프로세스 또는 상위 프로세스에도 전송됩니까? 모든 Linux 배포판에서 동작이 표준화되어 있습니까?
답변1
모든 프로세스를 강제 종료하는 데 사용됩니다 SIGKILL
(계속 대기 중인 프로세스 또는 좀비 프로세스 제외). 이 프로세스의 모든 하위 프로세스를 종료하기 위해 프로세스 그룹의 모든 프로세스에 신호를 보낼 수 있습니다. 이는 음수 PID를 지정하여 수행됩니다. 예를 들어 1234가 응답하지 않으면 kill it 및 해당 하위 항목을 사용할 수 있습니다 kill(-1234, SIGKILL)
. 그러나 Xfce는 이 신호를 전체 프로세스 그룹에 보내는 것이 아니라 창이 있는 프로세스에만 보내는 것 같습니다.
이는 SIGKILL
프로세스를 종료하는 가혹한 방법입니다. 대부분의 신호와 달리 종료 신호를 받은 프로세스는 신호를 받은 후 실행할 정리 루틴을 설정할 수 없으므로 파일에 쓰는 도중에 종료되어 파일이 손상될 수 있습니다.
존재하다helper-dialog/helper-dialog.c:83
, 귀하가 본 메시지는 다음과 같습니다.
dialog = gtk_message_dialog_new (NULL, 0,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_YES_NO,
_("This window might be busy and is not responding.\n"
"Do you want to terminate the application?"));
terminateShowDialog()
대화 상자는 자체적으로 함수를 호출하는 함수에서 트리거됩니다 terminateProcessIO()
. 둘 다 정의되어 있습니다.src/terminate.c
. 그런 다음 에 정의된 를 terminateProcessIO()
호출하세요 .clientTerminate()
src/client.c:2730
. 여기에서 사용된 것을 볼 수 있습니다 SIGKILL
:
if (kill (c->pid, SIGKILL) < 0)
{
g_warning ("Failed to kill client id %d: %s", c->pid, strerror (errno));
}