0

重複の可能性:
標準シグナル ライブラリからの C 宣言

構文のリンクへの参照は次のとおりです。関数へのポインタの構文しか理解していません。しかし、これは複雑すぎます。説明してください。

http://www.cplusplus.com/reference/clibrary/csignal/signal/

指定された正確な構文を理解しようとしています(解決できないポインターの混乱があります)。

4

1 に答える 1

4

signal()注釈で言及したリンクからのコード例を次に示します。

//This is a signal handling function. When your main program gets a signal, it
// will call this function. The function just prints a message.
static void catch_function(int signal) {
    printf("Interactive attention signal caught.");
}

int main(void) {
    //register to catch the interrupt signal.
    if (signal(SIGINT, catch_function) == SIG_ERR) {
        printf("An error occurred while setting a signal handler.\n");
        return EXIT_FAILURE;
    }
    while(1)
    {
      printf("do stuff\n");
      sleep(1);
    }
}

このコードは、^C (ctrl+C) 割り込み信号を受け取るまで、(何かを実行して) 永遠にループします。その時点で、私たちが指示したことは何でも実行します。

mike@linux-4puc:~> ./a.out 
do stuff
do stuff
^CInteractive attention signal caught.do stuff
do stuff
do stuff
do stuff
do stuff
^CInteractive attention signal caught.do stuff

シグナル関数は次のように定義されます。

typedef void (*sighandler_t)(int); //this just means a pointer to a function
                                   //that looks like:  void sighandler(int)

sighandler_t signal(int signum, sighandler_t handler); 

つまり:

  1. シグナルを処理する関数へのポインタは、「sighandler_t」で参照できます。
  2. sighandler_t 型を満たす関数は、何も返さず、int を受け取る必要があります。
  3. 次に、シグナル関数は、キャッチするシグナル タイプのパラメーターと、"sighandler_t" typedef を満たす関数を受け取ります。

次に、システム レベルで、プログラムの実行中にシグナルが着信し、それに対する処理がある場合は処理を行います。適切な処理がない場合、OS は既定のアクションを実行します。

上記の例からシグナル呼び出しを削除すると、ctrl+C がシグナル ハンドラーの実行を許可するだけでなく、プログラムを強制終了することがわかります。

あなたの質問に答えますか?

于 2012-09-24T18:07:25.083 に答える