私はMac OS上で私のCプログラムを実行します。私のプログラムの一部は以下の通りです。このコードはsigintシグナルでうまく動作しますが、sigkillシグナルでは動作しません。私はprintfのから見ることができ、それは関数SIGINT()を入力し、フラグの値を変更することができ、私はsleep(1)
を書いていないまずCで、linux、signalについてkillとloop()でsleep()
:
void sigkill(int sig){ /*some code neglected*/ exit(0); } void sigint(int sig){ flag=1; } void alive(void) { signal(SIGINT, sigint); signal(SIGKILL, sigkill); alarm(10); while(1){ //printf("%d\n",flag); sleep(1); if(flag==1){ printf("no\n"); flag=0; } } }
は、私は4つの質問を持っています。しかし、私は期待どおりに "いいえ"出力はありません。
スリープ機能を追加した後、正常に機能します。 whileループは1秒ごとにフラグをチェックし、フラグ= 1なら "no"を出力すると仮定します。しかし、Ctrl + cを押すたびに「いいえ」と表示されるようです。なぜ1秒待たないのですか?
質問は「あなたは10秒を待つように 『睡眠を()』を使うべきではありません。アラーム()を使用し、ループに結合された。」と述べました私はsleep()なしでこれを実装する方法を知りたい。
killコマンドはsigkill関数を呼び出せません。どのように修正するのですか?一般的に
「SIGKILL」期間をトラップすることはできません。 'SIGKILL'のトラップを設定することはできません。偶然にも 'SIGSTOP'と同じです。 –
あなたはsleep()を使わないでそれを実装する方法を知っていますか? –
'alarm()'と 'sleep()'を混ぜることは100%信頼できません。それが中断し、シグナルハンドラ戻っているときにのみ返す '一時停止()' - あなたは 'アラーム()'と 'ポーズ()'を使用することができます。あなたは、サブ秒が眠る行うには() 'と'ポール() 'とプラットフォーム固有のバリアントを選択する'使用することができます。あなたが 'にnanosleep()'と 'はusleepを使用することができます()'眠っナノ秒とマイクロ秒の解像度を行うには(精度は一般的に解像度ほど良好ではないが)。あなたが一生懸命見ていると、どこかに何百分もの睡眠があります。 –