2017-01-12 1 views
0

내가 미리 정의 된 루프를 사용하지 않고 무한히 매 3 초마다 인쇄 PID와 PPID와 루프 C에서 프로그램을 작성하려는 당신이 잘 이상한 수면 동작은

을하고 희망 (아무 잠시 동안 아무를 ..)

문제는 신호 처리기 내부에서 절전 시스템 호출을 사용할 때 아무 것도 인쇄하지 않지만 주석을 달아서 무언가를 반복하고 내가 원하는 것을 인쇄 할 때 문제가되는 것입니다.

다음은 C 표준은 거의 만이 글로벌 상태에 영향을 미치는 신호 처리기 한 일을 할 수있는 코드

#include<stdio.h> 
#include<stdlib.h> 

#include<unistd.h> 
#include<signal.h> 
#include<sys/wait.h> 

void handle1(int signum){ 
    //sleep(3); // when i remove the sleep it loop infinitly and prints 
    printf("pid=%d ppid=%d",getpid(),getppid()); 
    if(signum==SIGUSR1){ 
     kill(getpid(),SIGUSR1); 
    } 
} 
int main(int argc , char* argv[]){  
    signal(SIGUSR1,handle1); 
    kill(getpid(),SIGUSR1); 
} 
+3

* 신호 처리기에서 * async-signal-safe 함수 만 안전하게 호출 할 수 있습니다. 'sleep()'도'printf()'도 비동기 신호에 안전하지 않습니다. http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04 –

+0

을 참조하십시오. 결국 루프를 사용할 수있는 방법이 없다고 생각합니다. 그래서 문제는 제가 사용했던 접근법에 있습니다. –

답변

3

입니다. volatile sig_atomic_t 변수를 설정하십시오. 신호 처리기에서 printf, sleep 등을 호출하는 것은 허용되지 않습니다.

많은 프로그램이 이러한 규칙을 어기면 시스템이 다른 것들을 작동하게하고 운이 좋으면 printf가 작동합니다 (분명히 그렇지 않은 상황이 있습니다). sleep이있는 많은 시스템을 생각할 수 있습니다 절대로 일할 기회가 없어요.

기본적으로 규칙을 너무 많이 위반하기 때문에 일부 시스템에서 작동하는 경우 운이 좋을뿐입니다. 올바른 프로그램이 아니기 때문이 아닙니다.