2017-03-11 10 views
0

私はこのコードが何をしているのか理解しようとしています。このコードは何をしますか? C

int sethandler(void (*f)(int), int sigNo) { 
    struct sigaction act; 
    memset(&act, 0, sizeof(struct sigaction)); 
    act.sa_handler = f; 
    if (-1==sigaction(sigNo, &act, NULL)) 
     return -1; 
    return 0; 
} 

void sigchld_handler(int sig) { 
    pid_t pid; 
    for(;;) 
    { 
     pid=waitpid(0, NULL, WNOHANG); 
     if(0==pid) return; 
     if(0>=pid) { 
      if(ECHILD==errno) return; 
       ERR("waitpid:"); 
     } 
    } 
} 

これは、メインの関数呼び出しです:

if(sethandler(sigchld_handler, SIGCHLD)) 
    ERR("Setting parent SIGCHLD Error:"); 

ERRだけで、エラーの種類を出力し、それが発生した行に、それは質問とは無関係です。

以下は私が混乱していることです: 最初にsethandlerまたはsigchld_handlerと呼ばれる機能はどれですか? (*f)(int)とは何ですか? act.sa_handler = fとは何ですか?

答えて

3

呼ばsethandler iはおよそ困惑しているものです:最初sethandlersigchld_handlerと呼ばれる機能?

sethandlerは、このコードで直接呼び出される唯一の関数です。ただし、sigactionの電話番号をsethandlerに設定すると、後でsigchld_handlerが呼び出されることがあります。

(*f)(int)の意味は?

void (*f)(int) 1つのint引数を取り、voidを返す関数を指し、f名前ポインタ変数です。 (この場合、指し示されている機能はsigchld_handlerです)

act.sa_handler = fとは何ですか?

ポインタはact.sa_handlerに割り当てられます。これは、その関数をシグナルハンドラとして登録するために使用されます。

+0

'sethander'関数のどの行で' sigchld_handler'関数が呼び出されますか? –

+1

どれもありません。この関数は呼び出されません。シグナルハンドラとして登録されています。 – duskwuff

1

sigactionの宣言が必要です。

fは、関数int - > voidへのポインタです。

sa_handlerは、関数へのポインタに設定されたsigactionのen要素です。

最初に呼び出された情報は、投稿したコードには記載されていません。

追加:以下の最初の

2

void (*f)(int)の意味は?

は、1つのintの引数を取り、任意の結果を返さない関数へのポインタとしてfを宣言するための構文です。私は可読性の理由から、function's signaturetypedefを使用することをお勧めします。

あなたはとCでのプログラミングについては、別の良い本(例えばSICPfirst-class値として処理関数の関心を説明する)プログラミングの良い本を読む必要がありますよ、その後realize Cがnotが本物closuresを持っている、とあなたことないこと表記規則callbacksを使用する必要があります。

act.sa_handler = f;は、それが構造actのメンバーsa_handlerにあなたは慎重信号について読む必要がある関数ポインタf

を割り当て

を何をするのでしょう。 I最初に(そのいくつかの書籍は、あなたの質問に答えるために必要とされる慎重signal(7)非同期シグナルセーフ機能の概念を理解するのが難しいとが重要である)とsigaction(2)

を読んで、その後Advanced Linux Programmingを読むことをお勧めします。私は、参考にしましたが、読んで数週間かかる必要があります)

関連する問題