2012-03-03 3 views
5

코드를 작동하지 않습니다 : 내가 코드를 실행의 printf가 (최소화 경우) 첫 번째 질문에 C 신호 처리기에서

#include <stdio.h> 
#include <signal.h> 

int counter = 0; 

void react_to_signal(int n) { 
    fprintf(stderr, "Caught!\n"); 
    counter++; 
} 

int main(int argc, char** argv) { 

    signal(SIGINFO, react_to_signal); 

    while (1) { 
     printf("%d\n", counter); 
    } 

    return 0; 
} 

, 그것은 ..

다른 쉘에서 다음 0을 인쇄, 예상대로 루프
kill -s SIGINFO <pid_of_my_process> 

신호가 전달되면 c이 증가하지만 fprintf은 발생하지 않습니다.

왜 이렇게됩니까? 핸들러 코드는 어떤 환경/컨텍스트에서 실행됩니까? 이 부분을 어디에서 읽을 수 있습니까?

+0

'fflush (stderr)'를 사용하여 stderr을 비우십시오. – Saphrosit

+2

printf() 등을 사용하지 마십시오. 내부 신호 처리기. 그들은 신호 안전하지 않습니다. (예 : malloc()은 신호 안전하지 않습니다.) – wildplasser

+0

놀랍게도, 게시하기 전에 'fflush'를 사용하여 변형 된 것을 시도해 보았습니다. 다시 컴파일하거나 실행하거나 화면에서 메시지를 이동하는 무한 루프로 다리에서 자신을 쏜 적이 없습니다. 그래서 무언가와 바보. – ntl0ve

답변

14

: 당신은

비동기 신호 안전 섹션에서, 신호 처리기 man 페이지에서 list of authorized functions있다 시그널 핸들러 내에서 안전하게의 printf를 사용할 수 없습니다. 거기에 fprintf가 없습니다.

왜냐하면이 함수는 주로 malloc과 free를 사용할 수 있기 때문에 인 재진입형이 아니기 때문입니다. 자세한 내용은 this post을 참조하십시오.

+0

알겠습니다. 이제 모두 명확합니다. 고마워요! – ntl0ve

1

메시지가 프로그램을 종료하기 전에 작성하려면 stderr를 fflush해야 할 수도 있습니다.

한마디로
+0

개행에 도달하면'printf'가 자동으로 플러시되지 않습니까? –

+1

아니요. https://stackoverflow.com/questions/5229096/does-printf-always-flush-the-buffer-on-encountering-a-newline –

관련 문제