3

Wine サーバーが起動すると、open_master_socket() を介して Unix ソケットが作成されます。後で起動されるすべての Wine プロセスは、このソケットを使用して Wine サーバーに接続します。server/request.c,open_master_socket() のコードは次のとおりです。

 771     if (!foreground)
 772     {
 773         if (pipe( sync_pipe ) == -1) fatal_perror( "pipe" );
 774         pid = fork();
 775         switch( pid )
 776         {
 777         case 0:  /* child */
 778             setsid();
 779             close( sync_pipe[0] );
 780 
 781             acquire_lock();
 782 
 783             /* close stdin and stdout */
 784             dup2( fd, 0 );
 785             dup2( fd, 1 );
 786 
 787             /* signal parent */
 788             dummy = 0;
 789             write( sync_pipe[1], &dummy, 1 );
 790             close( sync_pipe[1] );
 791             break;
 792 
 793         case -1:
 794             fatal_perror( "fork" );
 795             break;
 796 
 797         default:  /* parent */
 798             close( sync_pipe[1] );
 799 
 800             /* wait for child to signal us and then exit */
 801             if (read( sync_pipe[0], &dummy, 1 ) == 1) _exit(0);
 802 
 803             /* child terminated, propagate exit status */
 804             wait4( pid, &status, 0, NULL );
 805             if (WIFEXITED(status)) _exit( WEXITSTATUS(status) );
 806             _exit(1);
 807         }
 808     }
 809     else  /* remain in the foreground */
 810     {
 811         acquire_lock();
 812     }

acquire_lock() は、マスター ソケットをセットアップするために使用されます。問題は、バックグラウンドで実行する場合、なぜ fork() を実行して子プロセスに処理を任せるのに、親プロセスは待機して exit() するだけなのでしょうか? そして、なぜフォアグラウンドで実行しないのですか?

4

2 に答える 2

2

fork()そして子プロセスに仕事をさせる」「バックグラウンドで実行」です。

パイプは、子が失敗する可能性のあるセットアップ (この場合はロックの取得) を実行している間、親をそばに置いておき、失敗が発生した場合に適切に伝達するためのイディオムです。そうしないと、子が失敗したことを簡単に見つけることができず、その存在を確認するか、後でログ ファイルをスキャンして、何か問題が発生したかどうかを確認する必要があります。

于 2012-04-22T06:47:01.550 に答える
1

はい、デーモン!
ninjalj のおかげで、これはバックグラウンドで実行されるデーモンを実装する一般的な方法であり、フォークされた子 (デーモン) にデーモンのことをさせます。また、exit() ではなく _exit() を使用する親は、一時ファイルが予期せず削除されないようにするためです。
デーモンの詳細について は、プロセス デーモンの作成方法および http://software.clapper.org/daemonize/を参照してください。

そして geekosaur は、_exit() の前に子を待つ必要がある理由をよく説明しています。

于 2012-04-25T13:46:15.217 に答える