2

簡単なWebサーバーを作成しています。簡略化したプログラムは次のとおりです。

while(1)
{
     // accepting the connection.
     accept();

     pid = fork();

     if(pid == 0)
     { 
          // performing some operations
          _exit(EXIT_SUCCESS);

     } else {

          sleep(1);
     }
}

したがって、子プロセスが実行されると、それは終了し、親プロセスは接続を受け入れ続ける必要があります。しかし、私にとっては、子プロセスは終了せず、それ(子)でさえ接続を受け入れています。私はここで何か間違いをしていますか?

を使用してプロセス(子)が強制終了されていないことがわかります。

top -U <username>

これについて助けが必要です。前もって感謝します。:)

4

2 に答える 2

3

親プロセスはwait、子プロセスを「取得」するために呼び出す必要があります。

子プロセスを「待機」する必要があるのは、プロセスが終了した後、子プロセスの終了コード用にまだリソースが残っているためです。(およびその兄弟システム コール) が行っていることwaitは、子プロセスが終了するのを待つだけでなく、終了コードを取得して、子プロセスがオペレーティング システムによって適切にクリーンアップされるようにすることです。親プロセスが、それ自体が終了する前にすべての子プロセスが終了するのを待たない場合、すべての子プロセスが孤立し、プロセス ID を持つプロセス1が親として設定されます。

于 2012-11-27T12:57:09.863 に答える
1

まず、私を助けてくれたみんなに感謝します。コードに誤りがあります。:)

問題は、接続を受け入れてフォークした後、子プロセス内で、次のclose()ような受け入れメソッドで使用されるファイル記述子を使用してソケット接続に到達したことでした

accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

その後close(sockfd)、子プロセス内で呼び出す必要があります。子プロセスで閉じられていなかったため、ソケットはaccept()接続のために生きていました。そのため_exit()、関連するソケット ファイル記述子が閉じられるまで、子プロセスは終了されません。

これに加えて、親プロセス内で呼び出すwait()waitpid()、必要に応じて子プロセスをプロセステーブルから削除し、ゾンビ状態を回避します。

于 2012-11-28T12:38:37.343 に答える