2013-02-04 4 views
0

우분투에서 신호 처리 기능을 작성하려고했습니다.우분투 11.04의 신호 처리 기능

#include<signal.h> 
    void abc(); 

    main(){ 

    printf("Press Ctrl-z key to send SIGINT signal"); 
    signal(SIGINT,abc); 
    for(;;); 
    } 
    void abc(){ 
    printf("The key has been pressed"); 
    } 

intersting 인자이다 : 코드는 다음과 같다 a) 최초의 printf()가 B 도시되지 않음)뿐만 아니라 제의 printf();

나는 책에서 코드를 썼다. 어떤 실수를 내가 실수했는지 또는 코드가 우분투를 위해 수정 될 것인지 알려줄 수 있습니까?

고지.

답변

0

stdout은 라인 버퍼입니다.

당신은 printf()에 전달 된 문자열에 \n를 추가하는 것 같아서 : 포 그라운드에서 실행중인 프로세스에 전송 SIGINT을 누르면

printf("The key has been pressed.\n"); 

Crtl-C합니다. SIGINT의 기본 처리기가 앱을 종료합니다.

OP의 앱이 SIGINT에 대한 신호 처리기를 설치하므로 앱을 종료하지 않고 Ctrl-C을 누르면 계속 실행되므로 SIGINT이 발생합니다. 설치되어있는 한 Ctl-C에 호출됩니다.

는 한 번만 호출 abc() 데의 동작을 달성 다음과 같이 신호 처리기를 수정하려면 :

void abc(int sig) /* 'sig' gets the signal nuber passed in (here: 'SIGINT') */ 
{ 
    printf("The key has been pressed.\n"); 
    signal(sig, SIG_DFT); /* (re-)sets the signal handler for `sig` to the default handler. */ 
} 

또한 읽기 : man signal

+0

man sigaction 대단히 감사합니다. 하지만 귀하의 대답과 프로그램의 출력은 몇 가지 질문을 제기합니다 : 당신은 대답 할 수 pls : 대답) 내가 만든 신호 기능을 실행 \ n 뒤에 논리는 무엇입니까? b) 내 출력은 언론 ctrl-c만큼 DEL이 눌려진 것을 계속 보여줍니다. 그것은 aftr 내가 Ctrl-z를 눌러 종료합니다. 하지만 내 논리에 따르면 "DEL은 눌려져있다"는 말은 ctl-c를 누르면 종료 될 것입니다. u pls가 뒤에 논리를 설명 할 수 있습니까? 다시 한번 고마워요. – user2015915

+0

@ user2015915 'stty'가 엉망이 된 것처럼 들리는데 ... "보통", "SIGINT"는'ctrl-z '(대개'SIGTSTP'를 의미)가 아닌'ctrl-c ' DEL '은 신호와 관련이 없습니다. 여기 정확히 무엇을하려하는지 정확히 알지 못합니다 ... – twalberg

+0

@twalberg : Sry. 나는 유닉스 기반의 책에서이 코드를 작성했습니다. 어디서 신호가 DEL.I 사용 되었습니까? ctrl-c ot ctrl -지. 하지만 ctrl-c를 누르면 ctrl-z를 누르면 abc()가 내 출력을 실행하지 못하기 때문에 Ctrl 키를 누른 채로 두 번째 printf()를 표시하고 프로세스를 종료합니다. 이 이론은 u가 ctrl-c를 누르면 scnd 시간이 끝난다 고 말합니다. 하지만 내 경우에는, scnd printf()는 ctrl-c를 누를 때까지 실행됩니다. – user2015915