2010-07-06 4 views
3

리눅스 터미널에서 Ctrl + C가 사용자에게 눌려 질 때까지 반복적으로 작업을 수행하는 프로그램을 작성하고 있습니다. 나는 C.에서 프로그래밍 오전 어떤 아이디어를 어떻게 구현할 수 있습니다.터미널에서 Ctrl + C가 눌릴 때까지 C 프로그램을 실행하십시오.

"for"루프를 조건으로 사용하여 프로그램을 테스트했지만 Ctrl + C가 사용자에게 눌려져 중단 될 때까지 실행하려고합니다. 내가 생각 무엇

는 다음

같은 루프를 수행하는 동안 할 일을 기록이었다 { /계산/ } 동안

합니다 (Ctrl + C 명중되지 않음)하지만 난 잘 모릅니다 사용자로부터 Ctrl + C 입력을 확인하는 방법.

모든 의견을 환영합니다.

감사

+0

프로그램을 Ctrl + C에서 끝내시겠습니까? 아니면 프로그래밍 방식으로 Ctrl + C를 눌러서 몇 가지 조치를 취하시겠습니까? – nos

+0

예 Ctrl + C를 감지하고 다시 돌아온 후 한 줄을 인쇄하고 싶습니다. 기본적으로 while 루프에서 나와 라인을 인쇄하십시오. –

답변

12

신호 트랩은 spudd86의 제안보다 더 정확하게 트릭을 수행합니다. 이 예제는 상당히 개선 될 수 있습니다.

#include <signal.h> 
/* ... */ 

int execute; 
void trap(int signal){ execute = 0; } 

int main() { 
    /* ... */ 
    signal(SIGINT, &trap); 
    execute = 1; 
    while(execute){ 
     /* ... */ 
    } 
    signal(SIGINT, SIG_DFL); 
    /* ... */ 
} 
+0

이 방법이 더 바람직한 이유에 대해 자세히 설명해 주시겠습니까? –

+1

정리 (메모리 여유, 설정 저장, 파일 핸들 닫기 등)는 사용자가 무한 루프를 중단 할 때 완료되지 않습니다. 이렇게하면 루프가 끊어진 후에도 작업을 계속할 수 있습니다. 이것은 단순한 정리 또는 프로그램 흐름의 연속 일 수 있습니다. – You

+0

(무거운 계산을 수행하는 메뉴 기반 프로그램을 상상해보십시오. 사용자가 계산을 중단 할 수 있으며이 방법으로 메뉴에 다시 보낼 수 있습니다. 무한 루프에서는 불가능합니다.) – You

6

Ctrl + C가 프로그램 신호 (SIGINT)를 보낼 것입니다, 당신은 당신의 프로그램이 종료하게됩니다에 대한 처리기를 설정하지 않은 경우. 그래서 당신이해야 할

do { 
    //computation 
} while(1); 

를 작성하고 그 당신이

편집이 원하는 것을 할 것입니다 : 위해 당신이 정말 컴파일러의이 발생할 수 있습니다 일을 일을 신호 처리기를 필요로하고, 피하지 않고 원 코드를 깨는 최적화 당신은이 작업을 수행 할 수 있습니다 Ctrl-C를 치면 때, 신호이 프로그램에 전송됩니다

#include <signal.h> 
/* ... */ 

int main() { 
    sigset_t set, oldset; 

    sigemptyset(&set); 

    /* ... */ 

    sigaddset(&set, SIGINT); 
    sigprocmask(SIG_BLOCK, &set, &oldset); 
    do { 
     sigset_t pending_set; 
     /* ... */ 
     sigpending(&pending_set); 
    } while(!sigismember(&pending_set, SIGINT)); 
    sigprocmask(SIG_SETMASK, &oldset, NULL); 
    /* ... */ 
} 
+0

루프가 끊어진 후 실행이 계속 될 것으로 예상되는 경우에는 작동하지 않습니다. – You

+0

나는 당신이 제안한 것을 시도했지만 프로그램이 무한 루프에 들어가서 내 Ctrl + C를 탐지하지 못한다. 나는 프로그램이 단순히 종료되지만 Ctrl + C를 발견 한 후 한 줄을 인쇄하고 싶다고 생각하기 때문에 Ctrl + C를 누르면이 루프에서 빠져 나와 한 줄을 인쇄하고 그 후에 돌아와야합니다. –

+0

자세한 답장을 주신 spudd86에게 감사드립니다. 감사합니다. –

0

. 기본 동작은 프로그램이 종료되었음을 나타냅니다.

이것은 프로그램이 영원히 돌아가며 끝없이 반복되도록 할 수 있음을 의미합니다. 사용자가 Ctrl-C를 누르면 프로그램이 중단됩니다.

관련 문제