私はclone()のLinuxのmanページをよく読んでおり、clone()ラッパーと「raw」システムコールの違いを理解しています。しかし、私が理解していないのは、ラッパーでCLONE_VMが使用されていない場合でも、親プロセスが子プロセスにスタックを割り当てる必要がある理由です。
CLONE_VMを使用しない場合、ラッパーはスタック引数を無視しますか?それではなぜ必要なのでしょうか?元のシステムコールではnullが許可されていますが、これは意味がありますが、ラッパーにこれが必要な理由を理解できません。ラッパーが言わなくても、子と親がメモリを共有できるようにしますか?
ベストアンサー1
必須スタックパラメータは次のとおりです。fn
議論。ネイティブカーネルシステムコールは次のように動作するため、常にスタックを必要としませんfork
。システムコールが返されると、子エントリの実行が開始されます。その後、libcラッパーは呼び出し内容を設定する必要がありますfn
。スタックが必要です(そしてこれはいつも行われてきました。)。
clone
したがって、システムコールを介して関数を呼び出すコードfn
(thread_start
glibcコード)に情報を渡すためにラッパーを呼び出すときは、常にスタックが必要です。