1

CLONE_VM フラグを clone() に渡さない場合、新しいプロセスは元のプロセスとメモリを共有します。これを使用して、2 つの異なるアプリケーション (2 つの main()) を同じプロセスで実行できますか? 理想的には、これは CLONE_VM で clone() を呼び出してから exec() を呼び出すのと同じくらい簡単ですが、おそらくもっと複雑になると思います。少なくとも、生成されたアプリケーションをコンパイルして再配置可能 (-fPIC) にする必要があると思います。アプリケーションをいつでもライブラリに再コーディングし、他の「アプリ」をスレッドとして生成するマスターアプリを作成できることはわかっていますが、このアプローチが可能であることに興味があります。

4

3 に答える 3

2

そうです、それがスレッドであり、「2 つの別個の main()/アプリケーション」部分を除いたものです。

実際、その理由clone(2)はスレッドを実装するためです。

Clone(2) では多かれ少なかれ別のスタックを宣言する必要があります (作成しない場合)。これがないと、子は親のスタックを破棄せずに現在の呼び出しレベルから戻ることができないからです。

各プロセスのスタックの設定を開始したら、posix スレッド ライブラリを使用することもできます。

2 つの異なるアプリケーションがロードされる部分に関しては、呼び出しexecve(2)はおそらくそれを行う方法ではありません。最近では、とにかくカーネルが正確にプログラムを実行するわけではありません。イメージが Elf ダイナミック ローダーを実行するように設定されているのがより一般的で、カーネルが実際に実行するのはそれだけです。次に、ローダーmmaps(2)はプロセスとそのライブラリをアドレス空間に格納します。確かに、「2 つの別個のアプリケーション」を取得するためにこれを行うことができ、スレッド スケジューラは clone(2) を介してそれらを 2 つのプロセスとして実行できます。

于 2009-10-30T00:20:32.030 に答える
0

短い答え: それは不可能です。

独自のカスタム ELF ローダーを作成し、プロセスに対してカーネルが通常行う多くのことをシミュレートする意思がある場合は可能です。

それぞれのアプリをライブラリにコンパイルして、main (別の名前に変更) という 1 つの関数だけを公開することをお勧めします。次に、メインのスタブ プログラムが 2 つのライブラリとリンクし、それぞれのエクスポートされた関数を呼び出す必要があります。

于 2009-11-06T01:37:57.900 に答える
0

アプリケーションを同じ実行可能ファイルにコンパイルして、メインのスレッドとして起動しないのはなぜですか?

とにかくそれらを別々のタスクとして実行する際の問題は何ですか? 本当に必要な場合は、引き続きメモリを共有できます。

于 2009-10-30T07:59:54.280 に答える