"이 창은 사용 중이어서 응답하지 않을 수 있습니다..." 대화 상자에서 프로그램을 종료할 때 어떤 신호가 전송됩니까?

"이 창은 사용 중이어서 응답하지 않을 수 있습니다..." 대화 상자에서 프로그램을 종료할 때 어떤 신호가 전송됩니까?

XUbuntu에서 GUI 창이 있는 프로그램이 정지되면 "이 창이 사용 중이거나 응답하지 않을 수 있습니다. 응용 프로그램을 종료하시겠습니까?"라는 경고가 표시될 수 있습니다.

종료를 클릭하면 프로그램에 어떤 신호가 전송됩니까? 응답하지 않는 프로세스에만 전송됩니까, 아니면 모든 하위 프로세스, 스레드 또는 하위 프로세스 또는 상위 프로세스에도 전송됩니까? 모든 Linux 배포판에서 동작이 표준화되어 있습니까?

관련 질문: `_NET_WM_PING`에 응답하지 않는 그래픽 프로세스를 의도적으로 생성

답변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));
}

관련 정보