3

Ubuntu でプロセスとその動作を学習していますが、wait() で少し混乱しています。だから私の質問は:

  1. while(wait(NULL)>0);ステートメントの方法 は働いている?
  2. wait()のNULLの目的は何ですか?

ターミナルで出力を見ましたが、wait() 関数を実行しても親が実行され、子が作成されます。親の実行を停止するべきではありませんか? コードは次のとおりです。

int main(int argc, char *argv[])
{
pid_t childid;

if(argc!=2)
{
    printf("Please provide an argument in terminal! \n");
    return 0;
}

int i,n=atoi(argv[1]);

for(i=0;i<n;i++)
{
    childid=fork();

    if(childid==0)
    {
        printf("Inside Child process! \n My id is %d\n",getpid());
        break; // creating fan process structure
    }
    else
        if(childid>0)
        {
            printf("Inside Parent Process! \n My id is %d\n",getpid());
        }
}

while(wait(NULL)>0); 

printf("After While Statment!\n My id is %d\n My parent ID is %d\n Child id is %d\n",getpid(),getppid(),childid);

}

私はこれが非常に不十分な質問であることを知っていますが、これは人々が学ぶ方法です:)

ありがとう

4

1 に答える 1

4

while(wait(NULL)>0);ステートメントの方法 は働いている?

関数waitは、いずれかの子プロセスが終了するのを待ち、成功した場合は、終了した子プロセスのプロセス識別子を返します。子プロセスがない場合は、-1 を返します。

あなたのコードでは、親プロセスは基本的に、作成したすべての子プロセスの終了を待ちます。

また、どの子に対しても、プロセスが作成されていないため、この呼び出しはすぐに -1 を返します。

wait()の NULL の目的は何ですか? 待機のプロトタイプを見るとこんな感じで、

pid_t wait(int *status);

親プロセスは、変数 status で子プロセスの終了ステータスをフェッチし (その整数を更新するには、wait 関数で整数のアドレスを渡す必要があります)、WEXITSTATUS マクロを使用してその値を抽出できます。

NULL を渡す (変数はポインター型であるため NULL を渡す) ということは、プログラマーがその値に関心がなく、待機呼び出しにこれを通知していることを意味します。

待機関数の戻り値と非 NULL 引数の使用を説明するために、コードを少し変更しました。すべての子が値 (ループ インデックス i) を返すようになり、これが親によってフェッチされます。

Pl。これが役立つかどうかを確認し、

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

int main(int argc, char *argv[])
{
  pid_t childid;
  int ret;
  int status;

 if(argc!=2)
 {
    printf("Please provide an argument in terminal! \n");
    return 0;
 }

int i,n=atoi(argv[1]);

for(i=0;i<n;i++)
{
  childid=fork();

  if(childid==0){
    printf("Inside Child process! \n My id is %d\n",getpid());
    break; // creating fan process structure
  }
  else if(childid > 0){
        printf("Inside Parent Process! \n My id is %d\n",getpid());
  }
}

//The line below, will be immediatly false for all  the children
while ((ret= wait(&status))>0)
{
  printf("After While My id is %d and my  child with pid =%d exiting with return value=%d\n" ,
  getpid(),ret, WEXITSTATUS(status));
}
//The if below will be true for the children only
if ((0 > ret) && (childid == 0)){
   printf("Child with id %d exiting and my parent's id is %d\n", getpid(), getppid());
   exit(i);
 }
else{
   printf("Parent Finally Exiting\n");
 }
}
于 2012-09-23T11:46:45.883 に答える