4

次のコード スニペットを検討してください。

void do_child(void);

int main(void){
int n;
pid_t child;
printf("Write a number: ");
scanf("%d", &n);
if(n != 1){
exit(1);
}
child = fork();
if(child >= 0){ /* fork ok */
 if(child == 0){
    printf("Child pid: %d\n", getpid());
    do_child();
    _exit(0);
  }
 else{ /* parent */
    printf("Child parent: %d\n", getpid());
    _exit(0);
 }
}
else{ /* fallito */
    perror("No fork");
    return 1;
}
return EXIT_SUCCESS;
}

void do_child(void){
/* some code here */
if(1 != 1){
    /* what to write here?? _exit or exit*/
}   
}

子プロセスを終了するときは、_exit代わりに書くのが最善ですexitが、外部関数を呼び出す必要があり、この関数に出口を入れたい場合、何を書くべきですか? _exitまたはexit

4

2 に答える 2

5

exitに登録された関数を呼び出すことが期待できますatexit_exitそれはしません。通常、登録された各クリーンアップ ハンドラは、通常は登録されたプロセスで 1 回だけ実行する必要があります。これは、子プロセスが必要_exit()であり、親プロセスが必要であることを意味しexit()ます。子プロセスがexec他のプログラムを実行する場合 (これはおそらく最も一般的なケースです)、その新しいプログラムは登録済みのハンドラーを上書きします。これは、 に戻ることを意味しますexit()

外部関数に関して: 呼び出す必要があると思いますが、フォークを実行する前にexit親が自明でないものを登録した場合、奇妙な動作に遭遇する準備ができている必要があります。atexitしたがってexec、子供を入れるつもりがない限り、早い段階で分岐するようにしてください。また、独自のコードと使用するライブラリがインストールする可能性のある終了ハンドラーに注意してください。I/O バッファのフラッシュはその一例です。

于 2012-09-02T21:01:56.327 に答える
3

exit()クリーンアップ後に終了しますが、_exit()すぐに終了します。

通常の状況でexit()は、正しいアプローチであることをお勧めします-ただし、選択した場合、何をしているのか理解できると思います_exit()か?!

お気に入りにあるので、 MSDNオンラインを引用します:)

于 2012-09-02T20:55:22.437 に答える