2017-05-20 21 views
0

ncurses를 사용하여 C로 프로그램을 작성하고 있습니다. CRTL C 신호를 처리하려고합니다. 내 코드에서이 신호는 잡히고 처리되지만 프로그램이 올바르게 종료되지 않습니다. 내가 ncurses에서 빠져 나가는 방식 일 수 있습니까? 추가 연구없이ncurses의 신호 처리

//handle SIGINT signal 
void handle_signal(int signal){ 

    if(signal == SIGINT){ 

     clear(); 
     mvprintw(3,3,"A SIGNAL WAS ENCOUNTERED"); 
     refresh(); 
     sleep(1/2); 
     exit(0); 

    } //close if statement 

}//close handle_signal() function 
+0

'절전 (1/2)'? 그것들은 두 개의 정수이기 때문에 그 결과는 정수가 될 것입니다. 이것은'sleep (0)'호출과 동일합니다. 그게 니가 원하는거야? – SiggiSv

+0

나는 메시지를 인쇄하는 것을보기 위해서만 테스트를했다. 그것은 아무것도 해결하지 못한다 :( – CXB

답변

1

: 나는 curses 기능이 실제로 있었다 안전 신호 경우 매우 놀랄 것입니다. 시그널 핸들러를 최소한으로 유지하는 것이 좋습니다. 이상적으로 플래그를 설정하는 것이 가장 좋습니다. 당신의 신호 처리기

static volatile sig_atomic_t interrupted = 0; 

:

어딘가에 메인 루프에서
if (signal == SIGINT) 
    { 
     interrupted = 1; 
    } 

:

if (interrupted) 
    { 
     clear(); 
     mvprintw(3,3,"A SIGNAL WAS ENCOUNTERED"); 
     refresh(); 
     sleep(1); 
     endwin(); 
     exit(0); 
    } 

코드를 참고 endwin()를 호출하지 않았다 그래서, 당신은이 같은 문제를 해결해야한다 어느 곳에서나 정상적으로 터미널을 복원하려면이 옵션이 필요합니다.

initscr manual page에서 언급 한 바와 같이
1

는 ncurses를 핸들러 정리에 종료시 화면을 시도 SIGINT

에 대한 핸들러를 설치합니다. initscr (또는 newterm이)가

를 호출되지 않습니다하기 전에 설치 핸들러를 경우 예상대로 일반적으로 작동 있지만, 제한 사항이 있습니다. 이후에 처리기를 설정하면 어떤 기능을 수행 할 수 있는지에 대한 다양한 제한 사항을 고려해야합니다. 신호 처리기를 안전하게 호출 할 수 있습니다.

ncurses의 'SIGINT'처리 기능은 일반적으로 사용하는 일부 기능은 안전하지 않으며 신호를 받으면 다른 전략을 사용한다는 사실을 고려합니다 (100 % 신뢰할 수는 없지만 개량).

당신의 신호 핸들러는 계정에 그 중 하나를하지 않으며, malloc 사용하는 안전 기능이 아니기 때문에 예를 들어 ncurses를 위해 필요한 몇 가지 추가 출력 버퍼링을 처리하기 위해 malloc를 호출하고 "작동하지 않을"수 있습니다.

추가 읽기 :