web-dev-qa-db-ja.com

分岐するが終了しない

fork() の子がexec()または_exit()を呼び出すのは正常です。

childが関数からreturnする可能性がある現実的なシナリオはありますか?代わりにfork()と呼ばれますか?

void foo() {
  pid_t pid = fork();
  if(pid == 0) {
     ...
     return; //<-- the child is going to unwind the cloned call stack
  }
  ...

では、分岐した子供が戻ってくるための正当な用途は何ですか?これを管理する基準はありますか?

1
Will

forkを呼び出す関数が親と子の両方で返されることになっている簡単な例は、forkを呼び出す関数が単純なラッパー関数であり、の呼び出し元である場合です。 that関数は、親で何をするか、子で何をするかを選択する関数です。単純なラッパー関数は純粋なCにはあまり意味がないかもしれませんが、POSIX C++バインディングは、グローバルposix::fork()関数を呼び出すだけのfork()関数を合法的に提供したい場合がありますが、で宣言できます。グローバルネームスペースを汚染しないヘッダー。

穴居人はあなたの質問へのコメントでささいな例を挙げました。

関連する規格は、これに対処しないことでこれに対処しています。 fork()の説明は、それを呼び出す関数からの戻りに制限なしで指定されているため、実装はそれを禁止することを選択できません。

putcharの説明では、実装が'a'を印刷しないことを選択できないとは言っていないようですが、実装がそれを行った場合、私たちは完全に一致すると確信しています。それは標準が言っていることではなく、標準が言っていることでもありません、そしてそれをそのように解釈することはただばかげています。

2
hvd

execを呼び出す子は終了せず、新しいプログラムに置き換えられます(sameprocess で実行されます=)。

また、 execve(2) syscallは、いくつかの理由で失敗する可能性があります(したがって、常にそのような失敗を処理する必要があります)。その後、実行はexecの後に続行されます!

例を読む 高度なLinuxプログラミング 詳細については。これらの問題については、少なくとも1つの章があります。