0
int main()
{
    ...
    if(!fork())
        {
            execvp(cmdName,cmdParam);
        }
    printf("In main()...");
return(0);
}
  1. cmdName引数とcmdParam引数を正しく渡したとすると、main()の実行を再開する前に、execvpによって作成されたプロセスが終了するのをどのように待つのですか?
  2. execvp()は、新しくfork()されたプロセスの子であるプロセスを作成しますか?
4

4 に答える 4

3
  1. 親プロセスforkで、子プロセスのPIDを返すので、それを変数に格納してwaitpidから、子プロセスが終了するのを待つために使用できます。

  2. 実際にはそうではありません-によって作成された新しい子プロセスforkは親の複製であり、execvpそのプロセスイメージを新しいイメージに置き換えます。事実上、最初は親の2つの「コピー」があり、そのうちの1つが新しいプログラムになります。

于 2010-09-03T17:16:00.613 に答える
3

あなたの最初の質問のために:

次のようにwaitpid(2)を使用します。

int pid = fork();
if (!pid)
  {
    execvp(cmdName, cmdParam);
  }
waitpid(pid, NULL, 0);
printf("Resuming main()...\n");

2番目の部分:すべてのexec関数呼び出しがプロセスを引き継ぎます(いずれも戻りません)

于 2010-09-03T17:18:10.467 に答える
3

前述のように、フォーク呼び出しの値を保存する必要があります。あなたは本当にフォークのif以上のものを使うべきです。3つのケースがあります:

  1. 0:あなたは子プロセスです
  2. 0:あなたは親であり、子PIDを取り戻しました

  3. -1:何か恐ろしいことが起こり、フォークが失敗しました

あなたは本当にケース3について知りたいです、それはあなたの一日を台無しにするでしょう。(また、exec呼び出し)

int main() {
  int pid = fork();
  if(-1 == pid) {
     fprintf(stderr, "Big problems forking %s\n", strerror(errno);
     exit(-1);//or whatever
  }
  else if (0 == pid) {
    if (-1 == execvp(cmdName,cmdParam)) {
      //like above, get some output about what happened
    }
  }
  //no need to else here, execvp  shouldn't return 
  // if it does you've taken care of it above
  waitpid(pid, NULL, 0);
  printf("Resuming main()...");
}

return(0); }

于 2010-09-03T17:32:36.210 に答える
1

の戻り値を格納する必要がfork()あります。これは、実行可能ファイルごとに異なる値を返します(親の場合、子PIDの場合は0)。次に、を実行する必要があります。waitpid

于 2010-09-03T17:16:22.390 に答える