1

私はUNIXプログラミングに不慣れで、ゾンビプロセスと、fork()を2回使用してそれらを回避する方法について読んでいました。私は本からコードを読み、それを私のシステムで実行しようとしました。私はubuntu12.04を使用しています。次のコードを実行しました。

#include<stdio.h>   
#include<sys/wait.h>
#include<stdlib.h>

int main()
{
    pid_t pid;
    if(pid = fork() < 0)
        printf("Fork Error.!!!\n");
    else 
    if(pid == 0)
    {
        if((pid = fork()) < 0)
             printf("Fork2 Error.!!!\n");
        else 
             if(pid > 0)
                   exit(0);

        sleep(2);
        printf("Second Child, parent id: %d\n", getppid());
        exit(0);
    }
    if(waitpid(pid, NULL, 0) != pid)
        printf("Waitpid Error.!!!\n");

    exit(0);
}

私が得る出力は次のとおりです:

Second Child, parent id: 1
Second Child, parent id: 1

この本には、これは1回だけ印刷する必要があると書かれており、コードで何が起こっているかを確認したときに、それが起こるはずだと感じています。なぜ2回印刷されるのかわかりません。私はこのコードをネット上の多くの場所で見つけましたが、これを説明する何かを得ることができませんでした。どんな助けでも大歓迎です。ありがとう。!!

4

4 に答える 4

5

メインのコードの2行目-角かっこがありませんpid = fork()

if( ( pid = fork() ) < 0){
于 2012-08-12T18:34:04.710 に答える
5

この行で:

if(pid = fork() < 0)

pid = fork()他のフォークの場合と同様に、パーツの前後に括弧を追加する必要があります。fork() < 0の結果をに割り当てていpidます。フォークが失敗しなかった限り、それpidは最初のフォークの親と子の両方で0になることを意味します。したがって、子ブランチを実行する2つのプロセス(それぞれが独自の子を作成する)を取得し、なしを実行していwaitpidます。

于 2012-08-12T18:37:32.337 に答える
1

このリンクを確認してください。それは言う:

exit()と_exit()の間にはいくつかの違いがあり、fork()、特にvfork()を使用すると重要になります。

..。

fork()の子ブランチでは、exit()を使用することは通常正しくありません。これは、stdioバッファーが2回フラッシュされ、一時ファイルが予期せず削除される可能性があるためです。

これは私には理にかなっているので、期待どおりの結果を得るには、それに応じてコードを更新する必要があります。

于 2012-08-12T18:44:31.620 に答える
-1

pid_t pid;
if(pid = fork() < 0)
printf("Fork Error.!!!\n");

スレッドが作成されます。したがって、現在、メインスレッドと子スレッドの2つのスレッドがあります。列をなして

if(pid == 0)

子スレッドの現在のスレッドをチェックしています。ここでも、新しいスレッドを一列に作成しました

if((pid = fork()) < 0)
     printf("Fork2 Error.!!!\n");
else if(pid > 0)        //Do nothing if this is parent thread.
     exit(0);

これでスレッドが実行され、実行されます

printf("Second Child, parent id: %d\n", getppid());

したがって、メッセージは2回印刷されます。

于 2012-08-12T18:30:44.477 に答える