Linuxfork()
では新しいプロセスを作成するために使用されていることを学びました。子プロセスに新しいメモリを割り当ててから、ファイル記述子などのデータを親プロセスから子プロセスにコピーします。次にexec()
、独自のデータをロードしてプロセススペースを上書きするために使用できます。しかし、親プロセスのデータを子プロセスにコピーする必要があるのだろうか?子プロセスの実際のデータをそのプロセススペースに直接ロードするのはどうですか?
fork(システムコール)、アドレス空間、仮想メモリ(カーネルはMMUを使用しています)、コピーオンライト、プロセスについてもっと読む...
Advanced LinuxProgrammingもお読みください。これらの難しい概念を説明するいくつかの章があります。
親プロセスと子プロセスのアドレス空間は異なりますが、フォーク後の親子アドレス空間はほぼ等しくなります(仮想メモリとコピーオンライト技術のおかげです)。唯一の違いは、fork(2)システムコールの結果です(これは[ほぼ]プロセスを作成する唯一の方法です)
execve(2)全体の起動プロセスのアドレス空間(及び実行コンテキスト)を交換し、新しい実行可能プログラム(しばしば開始するために使用されるELFバイナリ実行可能ファイル)。
親プロセスから子プロセスにデータをコピーする必要はありません。カーネルはあなたのためにそれを魔法のようにやっています。
あなたは、いくつかやりたいことがあり、プロセス間通信は通常のパイプ(読み取りを通して、親と子の間(IPC)をパイプ(7) &パイプ(2) &ポール(2) 、設定する必要が...)の前にfork
。共有メモリを使用することをお勧めします(正しく使用するのは難しいため、初心者の場合は避けてください)が、同期に注意する必要があります。詳細については、shm_overview(7)およびsem_overview(7)を参照してください。
strace(1)も使用して、いくつかのフリーソフトウェアシェル(sash
またはなどbash
)のソースコードを調べます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加