bestsource

루프가 있는 프로그램은 CTRL + C로 종료되지 않습니다.

bestsource 2023. 10. 11. 20:50
반응형

루프가 있는 프로그램은 CTRL + C로 종료되지 않습니다.

사용자가 CTRL + C를 눌러 중단될 때까지 실행하고 싶은 프로그램이 있습니다.제가 그것을 누르면 아무 일도 일어나지 않고 프로그램을 중단하고 그 이후에 수동으로 종료해야만 프로그램을 종료할 수 있습니다.

이 코드는 무한 실행이 필요한 부분입니다.

while(true) {
    liveOrDie(field);
    printOut(field);
}

첫 번째 함수는 2차원 배열에 1 또는 0을 넣을 것인지 계산하고 두 번째 함수는 다음과 같이 for loop을 사용하여 출력합니다.

void printOut(int field[38][102]) {
for(int i = 0; i < 38; i++) {
    for(int j = 0; j < 102; j++) {
        if(field[i][j] == 1) {
            cout << "o";
        }
        else {
            cout << " ";
        }
    }
    cout << endl;
}

system("sleep .1");
}

절전 모드를 사용하므로 화면이 지워지기 전에 화면에 모든 것을 출력할 수 있는 충분한 시간이 있습니다.

그럼 프로그램은 다음과 같이 종료되지 않습니다.Ctrl+C. 이 동작의 원인은 무엇이며, 다음에 프로그램이 종료되도록 하는 방법Ctrl+C?

문서로부터system()(emphasis/볼드 마인):

system()library 함수는 fork(2)를 사용하여 다음과 같이 execl(3)을 사용하여 명령에 지정된 셸 명령을 실행하는 자식 프로세스를 만듭니다.

   execl("/bin/sh", "sh", "-c", command, (char *) 0);

system()명령이 완료된 후 반환됩니다.

명령을 실행하는 동안 SIGCHLD는 차단되고 SIGINT SIGQUIT는 호출 과정에서 무시됩니다(이러한 신호는 명령을 실행하는 자식 프로세스 내에서 기본값에 따라 처리됩니다).

그게 당신의 행동을 설명해주는군요

사용자 코드가 1ms와 같이 약간의 시간 동안 실행되고 슬립 프로세스로 인해 상위 프로세스가 100ms 동안 차단되는 것으로 의심됩니다. 따라서 키를 지속적으로 사용하지 않는 한 인터럽트는 무시될 가능성이 높습니다.

당신은 당신의 전화를 그냥 다음으로 돌려야 합니다.system("sleep .1")적절한 라이브러리 호출(예: 변경)을 통해:

system("sleep .1");

대상:

usleep(100000);  // NB: requires #include <unistd.h>

봐봐요, 남자는 자요.

신호를 잡아보셨나요?아래 코드 예시 참조:

if (signal (SIGINT, yourFunctionHandler) == SIG_ERR)
    {
        cout << "Error setting the SIGINT handler";
    }

void yourFunctionHandler (int signal)
{
    cout << "Signal " << signal << " received!";
    //do what's needed to kill loop
}

이런 식으로 루프 변수를 원하는 대로 수정할 수 있습니다.그리고 다른 사람들이 제안한 것처럼 system()을 사용하지 마십시오.

신호참조

소규모 튜토리얼

언급URL : https://stackoverflow.com/questions/25502117/program-with-loop-will-not-terminate-with-ctrl-c

반응형