16

Linux システムでは、子プロセスは親プロセスと同じ方法で既存のスレッドを表示しますか?

int main() {

  //create thread 1

  int child_pid = fork();

  if ( 0 == child_pid)
  {
       ..
  }
  else
  {
       ..
  }

子プロセスのアドレス空間全体がコピーされるため、スレッドの状態はどうなりますか。上記のセグメントのスレッド 1 が条件付きシグナルを待機している場合はどうなるでしょうか。子プロセスでも待ち状態ですか?

4

2 に答える 2

21

最近の Linux のスレッドは、POSIX 準拠を維持しようとしています。呼び出し元のスレッドのみが複製され、他のスレッドは複製されません (たとえば、Solaris では、リンク先のライブラリに応じて fork の動作を選択できることに注意してください)。

http://www.opengroup.org/onlinepubs/000095399/functions/fork.html (POSIX 2004)から:

プロセスは単一のスレッドで作成されます。マルチスレッド プロセスが を呼び出すfork()場合、新しいプロセスには、呼び出しスレッドのレプリカとそのアドレス空間全体が含まれる必要があります。これには、おそらくミューテックスやその他のリソースの状態が含まれます。したがって、エラーを回避するために、子プロセスは、exec関数の 1 つが呼び出されるまで、非同期シグナルセーフ操作のみを実行できます。pthread_atfork()呼び出し間でアプリケーションの不変条件を維持するために、この関数を使用してフォーク ハンドラーを確立できfork()ます。

の POSIX 2018 仕様fork()も同様です。

于 2009-07-02T14:19:59.667 に答える
1

スレッドは、fork() を使用する Linux システムの子プロセスから継承されません。詳細なソースはこちら: http://linas.org/linux/threads-faq.html

于 2009-07-02T13:00:40.170 に答える