0

私はubuntuで信号処理関数を書こうとしました。コードは次のとおりです。

   #include<signal.h>
   void abc();

   main(){

   printf("Press Ctrl-z key to send SIGINT signal");
   signal(SIGINT,abc);
   for(;;);
   }
   void abc(){
   printf("The key has been pressed");
   }

興味深い要素は次のとおりです。a)最初のprintf()は表示されません。b)2番目のprintf()と同様です。

私は本からコードを書きました。誰かが私が犯した間違いや、ubuntuのコードが変更されるかどうかを教えてもらえますか?

よろしくお願いします。

4

1 に答える 1

0

stdoutラインバッファリングされます。

\nに渡される文字列にaを追加することをお勧めしますprintf()

printf("The key has been pressed.\n");

Crtl-Cが押された場合SIGINT、フォアグラウンドで実行されているプロセスに送信されます。のデフォルトハンドラーSIGINTはアプリを終了します。

SIGINTOPのアプリは、アプリを終了しないシグナルハンドラーをインストールするCtrl-Cため、が押された場合に実行を継続し、aSIGINTが発生します。Ctl-Cインストールされている限り呼び出されます。

一度だけ呼び出した動作を実現するにはabc()、シグナルハンドラを次のように変更します。

void abc(int sig) /* 'sig' gets the signal nuber passed in (here: 'SIGINT') */
{
  printf("The key has been pressed.\n");
  signal(sig, SIG_DFT); /* (re-)sets the signal handler for `sig` to the default handler. */
}

さらなる読み物:man signalman sigaction

于 2013-02-04T18:47:08.710 に答える