2016-09-07 13 views
0

この質問は一つの質問に基づいており、私は昨日尋ねた: In C, linux, about kill signal and sleep() in loopC、異なるデバイス上の

これらのコードを、私のすべてのコードの一部です。

int flag=0; 

void sigint(int sig){ 
    flag=1; 
} 


void alive(void) { 
    signal(SIGINT, sigint); 
    while(1){ 
     //printf("%d\n",out); 
     //pause(); 
     //sleep(1); 
     if(flag==1){ 
      printf("no\n"); 
      flag=0; 
     } 
    } 
} 

技術的に私が望むのは、Ctrl-Cプログラムを押すと「no」を出力できます。 昨日、私のMacでは、これらのコードを実行して何も出力できないので、sleep(1)を追加して、よく動作し、pause()を追加します。 私はそれを考えました。実際、これは私の教授が私たちの日除けシステムで行うために残した課題の一部です。これらのコードをsunlabアカウント(Linuxプラットフォーム)にコピーした後。それを実行します。出力は以下の通りである:第二時間も出口のためのプレスCtrl-Cを、私はなぜ知らないとき

^Cno 
^C 

私は、一度だけのためにSIGINTシグナルを使用することができます。 私の友人は自分のコードを示しています、彼のコードは私がここに付いているものと同じです、一時停止も睡眠もなく、(1)またはfor(;;)の間のみ使用してください。彼の太陽の口座でうまくいく。

ここでは3つのデバイスについて説明しました。

私のMac:私はpause()やsleep(1)を使う必要があり、私が望む機能を実装することができます。いくつかの答えは正しく表示されているようです:In C, linux, about kill signal and sleep() in loop

私のsunlabアカウント:2番目のctrl-cの後に終了し、最初のctrl-cの後に 'no'を出力できます。一時停止()の存在は私の結果に明らかに影響しません

私の友人sunlabアカウント:うまくいきます。 pause()の存在は私の結果に明らかに影響しません なぜ違いですか?

サプライズ:私の教授の言葉によると、3番目は正しいはずです。

+0

フラグをvolatileとして宣言してください。私は、Cコンパイラがフラグ== 1チェックをループから抜いていると思われます。 –

答えて

0

私はそれを知っています、私はsignal()をリセットしませんでした。なぜ誰も私に言わない。

void sigint(int sig){ 
    flag=1; 
    signal(SIGINT, sigint); 
} 
関連する問題