2014-12-22 2 views
0

루프를 실행하지만 5 초 동안 CTRL-C를 사용하여 종료 할 수없는 프로그래밍을 작성하는 방법을 알아야하지만 5 초 후에 CTRL-C를 사용하여 프로그램을 종료 할 수 있습니다. 나는 시스템 호출에 대해 읽고 있었지만, 어디서부터 시작해야 할지를 알 수 없다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 정확한 지시가 있습니다. 고맙습니다.시스템 호출을 사용하는 데 문제가 있습니다

루프를 생성하고 컨트롤 C로 5 초 동안 죽일 수없는 시스템 호출을 사용하는 C 프로그램을 작성하십시오. 그것이 시작되면 "나는 루핑을 시작했고^C로 죽일 수 없다. . "그런 다음 매초마다"계속 반복됩니다. "라는 메시지를 인쇄합니다. . . "5 초 후에 제어 C로 루프를 종료하고"여전히 반복하고 있지만^C로 죽일 수있다 "라는 메시지를 표시합니다. 사용자가 죽일 때까지 매 초마다 표시됩니다.

+1

[sigaction] (http://man7.org/linux/man-pages/man2/sigaction.2.html)을 사용하여 Ctrl-C (SIGINT)를 캡처 할 수 있습니다. 가능한 sigaction에 대한 [예제 코드] (http://stackoverflow.com/questions/4217037/catch-ctrl-c-in-c). – SSC

+1

재미있는 방법은 인터럽트 문자를 처음 5 초 동안 control-T로 설정 한 다음 다시 control-C로 설정하는 것입니다. –

답변

1

signal(2) 인터페이스를보고 싶습니다. UNIX/Linux 환경에서 특정 프로세스 관련 이벤트가 발생하면 운영 체제에서 프로세스에 신호 (본질적으로 소프트웨어 인터럽트)를 보냅니다. signal 함수를 사용하여 신호를 "catch"하여 주어진 신호가 발생할 때 알리는 콜백 함수를 설정할 수 있습니다. Ctrl-C의 경우 SIGINT를보고 싶지만 동일한 인터페이스로 처리 할 수있는 다른 신호가 있습니다. 일시 중지는 간단합니다. sleep()을 반복적으로 사용하십시오.

+0

나는 asker가 셀프 서비스하는 법을 배우는 것에 대한 접근 방식을 좋아하지만'sleep()'이 그 스레드에서 일어나는 모든 작업을 차단한다는 것을 언급 할 가치가있다. –

+0

고마워, 나는 초기 답변에 '반복문'을 추가했다. OP는 매초마다 메시지를 출력 할 필요가 있기 때문에 신호 처리기를 설정 한 후에 그들은 이것을 할 수 있습니다 (물론 의사 코드 만 가능) : for (초) do {sleep 1 second; 메시지 인쇄}' – frasnian

+0

['sigaction()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)을 사용하는 것이 더 ['signal()']을 사용하는 것보다 낫습니다. (http://pubs.opengroup.org/onlinepubs/9699919799/functions/signal.html),'sigaction()'을 사용하는 것이 다소 힘들다. 'signal()'에는'sigaction()'에 의해 피해야 할 문제가 많이 있습니다. –

1

이 번호를 사용할 수 있습니다.

void handler(int signo) 
{ 
    signal(SIGINT,SIG_DFL); 
} 

main() 
{ 
    signal(SIGINT,SIG_IGN); 
    signal(SIGALRM,handler); 
    // your code. 
    alarm(5);// for 5 seconds. 
    while(1) 
    { sleep(1); 
    printf("your message\n"); 
    }  
} 

먼저 singal을 사용하여 SIGINT를 무시합니다. 그리고 sigalrm의 처리기. 그래서 처음 5 초 ctrl+c은 작동하지 않습니다. ctrl + c가 실행 된 후 sigalrm이 발견되면 작동합니다. 따라서 특정 시간대에 대한 질문 당 ctrl+c이 중지됩니다.

+0

전체 프로그램을 게시하여이 사람의 과제를 수행 하시겠습니까? 적어도이 OP는 올바른 방향으로 지적 되어야만했습니다 (숙제 관련 질문이 많은 다른 사람들과는 달리 완전한 프로그램을 요구합니다). 나는 OP가 그/그녀 자신을 위해 배울 기회가 있다고 생각합니다. IMHO. – frasnian

+0

나는 당신에게 당신의 대답을 삭제하라고 요구하지 않을 것입니다 - 그건 당신에게 달려 있습니다. 나는 질문자가 숙제를 도와달라고 요청하는 것이 드문 일이라고 생각한다. 그것은 내가 그들에게 "좋은 직장"을 보내길 원하게 만든다. 전자 카드 또는 뭔가. 'alarm()'을 사용하는 것은 광산과 다른 접근법으로'signal '에 대한 다른 용도의 예를 제공하므로 OP는 과제에서 더 많은 것을 배울 수 있습니다. 숙제를 추가 할 수도 있습니다. "이 방법을 사용하면 1 초마다 메시지를 어떻게 인쇄합니까?" – frasnian

관련 문제