2011-12-10 15 views
1

信号()システムコールを学習している間は、私は機能信号を(呼び出しています通常の関数呼び出しとsignal()システム呼び出しの違いは何ですか?

#include <stdio.h> 
#include <signal.h> 
void sigproc(int); 
void quitproc(int); 

int main(int argc,char **argv) 
{ 
signal(SIGINT, sigproc); //Is it like a normal Call to signal()? 
signal(SIGQUIT, quitproc);// This too? 
printf("ctrl- c disabled use ctrl\ to quit \n"); 
while(1); 
return 0; 
} 

void sigproc(int signo) 
{ 
printf("you have pressed ctrl - c \n"); 
} 

void quitproc(int signo) 
{ 
    printf("U cant quit\n"); 
// exit(0); 
} 

メインで2回)、次のコードに遭遇することになって()。しかし、Ctrl + CとCtrl + \キーを押しているときにのみ実行されます。私はそれも通常の関数呼び出しのように思った。シグナルハンドラ関数で実際に何が起こっていますか?

答えて

4

signal関数はシグナルハンドラを設定します。意味: "私のプロセスがこのシグナルを受け取ったとき、デフォルトである"を実行するのではなく、この関数を実行してください。

したがって、あなたの例では、signalへの呼び出しは、関数を呼び出しません。実際にアクションの信号を表示するには、次の操作を行います。

    は、別の端末から一方の端子
  • であなたのプロセスを開始し

  • kill -INT `pidof proc` 
    

側の注意点としては、printfと友人が上がりません非同期シグナル安全です。それはショッカーとして来るかもしれませんが、シグナルハンドラーでそれらを使用することは危険です。サイド側の注意点としては


、あなたがあなたの質問をUnixタグ付けされた場合でも、それは、信号(およびsignal機能)C.信号の標準、不可欠な部品の取り扱いとsignal機能しているがC99で説明されていることを知っておくことが重要です§7.14.1にある。

関連する問題