0

プロセスを fork() すると、カーネル内で do_fork() が呼び出され、それ自体の正確なコピーが作成されます。本を読んでみると、fork の子が exec を呼び出して新しいプロセスを作成すると書かれています。

例:

シェルで ls コマンドを実行すると、この方法で作成されます。

   sh(Parent)
       |
   sh(Child)
       |
   ls(New Process)

しかし、私は exec*() がどこでどのように呼び出されるのか理解できませんか? なぜなら、私が見ることができるのは、シェル(子)がフォークで作成されたものだからです。しかし、いつ、どこで新しいプロセスが作成/実行されるのでしょうか?

4

1 に答える 1

2

プロセスの 1 つ (通常は子プロセスですが、絶対に必要というわけではありませexec()ん) で実際に新しいプログラムを実行したい場合は、そうする必要があります。シェルが実行される特定のケースでは、lsシェルが最初にフォークし、次に子プロセスが実行されます。ただし、これは 2 つの異なる操作であることを認識することが重要です。

すべてfork()は、2 つの (ほぼ) 同一のプロセスを提供することであり、からの戻りコードを使用してfork()、親 (子の正の PID を取得するか、fork()失敗した場合は -1 を取得する) または子 (取得する)であるかを判断できます。 0)。

と が (ユーザーの制御下で) 連携する方法と、それらを相互に使用せずに使用する方法については、この回答を参照してください。fork()exec()

と同様にdo_fork()、これらはすべて、 にあるexecへの呼び出しに要約されます。do_execveexec.c

于 2013-05-21T02:43:35.007 に答える