関数signal.h
の宣言がありsignal
ます:
void (*signal(int signo, void (*func)(int))) (int);
これを解釈する方法と、この奇妙な方法で宣言することの用途は何ですか?
このsignal
関数はint
と 関数ポインタを引数として取り、関数ポインタを返します。関数ポインタ引数と返された関数ポインタはそれぞれint
引数を取り、 を返しますvoid
。
signal
プロトタイプは時々このように書かれます:
typedef void (*signal_handler_type) (int);
signal_handler_type signal (int, signal_handler_type);
このsignal
関数では、呼び出し元が既存のシグナル ハンドラーを置き換えることができるため、呼び出し後に置き換えられたものを返します。
APUEで、
シグナル関数のプロトタイプは、関数が 2 つの引数を必要とし、何も返さない関数 (void ) へのポインターを返すことを示しています。シグナル関数の最初の引数 signo は整数です。2 番目の引数は、単一の整数引数を取り、何も返さない関数へのポインタです。アドレスが signal の値として返される関数は、単一の整数引数 (最終的な (int) ) を取ります。簡単に言えば、この宣言は、シグナル ハンドラーに 1 つの整数引数 (シグナル番号) が渡され、何も返さないことを示しています。signal を呼び出してシグナル ハンドラーを確立する場合、2 番目の引数は関数へのポインターです。signal からの戻り値は、前のシグナル ハンドラへのポインタです。
示されている複雑なシグナル関数のプロトタイプは、次の typedef を使用することで、はるかに単純にすることができます。
typedef void Sigfunc(int);
その後、プロトタイプは次のようになります
Sigfunc *signal(int, Sigfunc *)
Signal
関数は、signo(here) で指定されたシグナル番号を持つシグナルの処理方法を指定します。
パラメーターfunc
は、プログラムがシグナルを処理できる 3 つの方法のいずれかを指定します。 [ここ][1] を参照できます。