2008-10-08 3 views
5

시작하기 전에이 명령 줄 도구는 아니지만 자체 명령 줄 인터페이스를 통해 명령을 받아들이는 응용 프로그램이라는 것을 분명히 밝힙니다.명령 줄 인터페이스에서 ctrl-break 신호를 처리하는 방법

편집 : 내가 전에 설명 한 내용에 대해 사과해야한다. 한 번 더 ...

나는 사용자의 명령을 받아들이는 명령 줄 인터페이스 응용 프로그램을 구축하고있다. 시그널 핸들러 셋업을 통해 시그널을 잡아 낸 다음 시그널을 설정하여 애플리케이션을 종료해야한다. 내가 겪고있는 문제는 내가 찾을 수있는 모든 콘솔 기능입니다. 즉, 사용자가 키를 누를 때까지 콘솔 처리 루프를 종료해야한다는 것을 감지 할 수 없습니다. (또는 함수에 따라 입력하십시오.).

비 블록 콘솔 상호 작용을 할 수있는 표준 방법이 있습니까, 아니면 그냥 신호 스레드에서 종료하면 제대로 처리 할 수 ​​있도록 프로그램을 구성하는 우아한 방법이 있습니까 (제발 이것을 잘못 이해하지 말아야한다. 시그널링 스레드로부터 리소스를 잠그고 풀어서 어떻게 할 수 있는지 알고있다.하지만 이것은 지저분해질 수 있으므로 차라리 피할 것이다.)

그 설명이 더 바람직하다. ...

윈도우에서

답변

6

, 당신이 할 수있는 신호 처리기를 등록 signal 기능을 사용 : 누군가가 Ctrl + C를 명중 할 때마다


#include <signal.h> 

void signal_handler(int sig) 
{ 
    // Handle the signal 
} 

int main(void) 
{ 
    // Register the signal handler for the SIGINT signal (Ctrl+C) 
    signal(SIGINT, signal_handler); 
    ... 
} 

지금, 당신의 신호 핸들러가 호출됩니다.

0

* nix 기반 시스템에서는이 작업을 수행하기 위해 신호 처리기가 실제로 필요하지 않을 수 있습니다. 당신은 당신이 SIGINT 전화

int main(void) 
{ 
    // Register to ignore the SIGINT signal (Ctrl+C) 
    signal(SIGINT, SIG_IGN); 

    while(1) 
    { 
    retval = my_blocking_io_func(); 
    if(retval == -1 && errno == EINTR) 
    { 
     // do whatever you want to do in case of interrupt 
    } 
    } 
} 

이 작동하는지 중요한 방법을 무시하도록 지정할 수있는 것은 그 비 차단 기능이 중단받을 수 있나요 인식하는 것입니다. 일반적으로 차단 기능 (예 : read())이 실패하고 함수를 다시 시도했음을 알 수 있습니다. 다른 값인 경우 적절한 오류 관련 조치를 취할 것입니다.

8

OK -은 Windows &에 나를 위해 노력하는 휴대용 - #ifdef를의 SIGBREAK 알 - 이것은 표준 신호가 아닙니다.

#include <csignal> 
#include <iostream> 
#include <ostream> 
#include <string> 
using namespace std; 

namespace 
{ 
    volatile sig_atomic_t quit; 

    void signal_handler(int sig) 
    { 
     signal(sig, signal_handler); 
     quit = 1; 
    } 
} 

int main() 
{ 
    signal(SIGINT, signal_handler); 
    signal(SIGTERM, signal_handler); 
#ifdef SIGBREAK 
    signal(SIGBREAK, signal_handler); 
#endif 
    /* etc */ 

    while (!quit) 
    { 
     string s; 
     cin >> s; 
     cout << s << endl; 
    } 
    cout << "quit = " << quit << endl; 
} 
+1

참고 : Windows에서, 시그 코드'SIGBREAK'을 (올릴 닫기 버튼을 클릭 CTRL- 예를 들어
, 이것은 현재 스레드와 미래에 signore SIGINT, SIGTERM 및 SIGPIPE가 스레드를 산란하는 방법입니다 단절) – 56ka

0

스레드 안전 나은 유닉스 나 용액 대신 pthread_sigmask() 신호를 사용하는 것이다().

sigset_t waitset; 
sigemptyset(&waitset); 
sigaddset(&waitset, SIGINT); 
sigaddset(&waitset, SIGTERM); 
sigaddset(&waitset, SIGPIPE); 
pthread_sigmask(SIG_BLOCK, &waitset, NULL); 
관련 문제