2017-01-12 8 views
0

は私が事前定義されたループを使用せずにinfinitly 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に設定します。シグナルハンドラでprintfsleepなどを呼び出すことはできません。

多くのプログラムがこれらのルールを破り、システムが他のものを動作させるようになり、おそらくあなたはprintfが動作するようになります。これまで働く機会はありません。

基本的にはルールが壊れているため、一部のシステムで動作する場合は運が必要なためです。それは正しいプログラムだからではありません。