3

私はosプログラムを実装しようとしました。コードは次のとおりです。

#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>

int main()
{
    pid_t pid, pid1;

    pid = fork();

    if(pid<0)
    {
            fprintf(stderr,"Fork Failed");
            return 1;
    }

    else if(pid == 0) /* child process */
    {
            pid1 = getpid();
            printf("child: pid = %d\n",pid);
            printf("child: pid1 = %d\n",pid1);

    }

    else   /* parent process */
    {
            pid1 = getpid();
            printf("parent: pid = %d\n",pid);
            printf("parent: pid1 = %d\n",pid1);

    }

    return 0;
}

およびその o/p:

parent: pid = 1836
parent: pid1 = 1835
child: pid = 0
child: pid1 = 1836

誰かがそれがどのように機能しているのか、つまり、コードに書かれた // ステートメントの実行シーケンスを説明できifますかelse-if。条件が真になると部分は実行されないelseと思いますが、ここでは親プロセス部分、つまり部分を実行し、次に子部分を実行しました.....どうしてですか?else ifelseelse

4

4 に答える 4

5

fork()を読む必要があります。ステートメントをヒットするfork()と、2 番目のプロセスが開始され、親プロセスが持っているすべてのコピーが作成されますが、別の実行を実行できますfork

 int main()
 {
   pid_t pid, pid1;
                   <--- up to here you have one process running
   pid = fork();   <--- when this returns you have two processes:
                          parent has pid = child's pid               child has pid = 0


   if(pid<0)       <--- child and parent both check this, it's not true so they move on
   {
     ....
   }
   else if(pid == 0)<--- this is true for the child, not the parent
   {
     ....           <--- child will now execute this code
   }
   else             <-- nothing else was true for the parent so it sees this
     ....           <-- and executes this code

はい、あなたは正しいです. if、またはelse ifまたはを押すと、単一のプロセスの実行でelse、コードの別のブランチに入るつもりはありません. 2 つのプロセスが実行されているため、と が表示されます。else ifelse

pid1がそのコードを実行しているプロセスを返すため、 がどのように異なるかに注意してください。2getpid()つの異なるプロセスがあることがわかります。else ifelse

于 2012-11-14T12:32:27.030 に答える
3

行うman fork

fork は実際にzeroは子プロセス ID を返しnon-zero、親は子の実際のプロセス ID が親に返されることを意味します

else if(pid ==0 ) {...}は子プロセス

そしてelse {...}親プロセスです。

fork の基本的な意味は、新しいプロセスを作成することです。

main が one を呼び出すfork()と、独自のアドレス空間を持つ子のみが作成されます。fork 呼び出しのすぐ下で、すべてのステートメントは親プロセスと子プロセスで同じです。

フォークを使用してプロセスを作成することは、これら2つparentを意味childし、独立したプロセスであり、デフォルトではそれらの間でデータを共有しません

しかし、あなたの場合、 fork 呼び出しの後、これら2つは独立しているため、これら2つのプロセスの実行順序は指定されていません。あなたはこれらのものを得るかもしれません:

1. parent executed and program terminates
parent: pid = 1235
parent: pid1 = 1234


2. child executed then parent and then program terminates :
child : pid = 0
child :pid1 = 1235
parent : pid = 1235
parent :pid1 = 1234

子が最初に実行され、次に親が終了する必要があることを確認したい場合。親コードwait(NULL);の最初のステートメントとして1 行を挿入しelse{..} ます。これは、親が子が終了するまで待機することを意味します。

于 2012-11-14T12:20:56.310 に答える
3

fork() は、元のプロセスから独立して実行される新しいプロセスを作成します。

新しい子プロセスがelse ifパーツを実行します。

既存の親プロセスがelseパーツを実行します。

子プロセスと親プロセスの間の実行順序は決定論的ではありません。現在、それらは異なるプロセスであり、カーネルがどのように感じても、OS はそれらを実行するようにスケジュールします。親プロセスと子プロセスのどちらが最初にコードを実行するかは、多かれ少なかれランダムになる可能性があります。

子と親からの printfs を交互に配置することもできます。

于 2012-11-14T12:28:12.173 に答える
2

プログラムを実行している 2 つの異なるプロセスがあります。の呼び出し後、fork次の命令が 2 回実行され、異なる値の がありpidます。したがって、 と の両方else ifelse部分が、それぞれ 2 つのプロセスのいずれかによって実行されます。

于 2012-11-14T12:20:28.433 に答える