fork()
プロセスをフォークしますが、すべてのスレッドをコピーしたり、すべてのsのレプリカを作成したりしませんfd
。fd
s は親と子の間で共有されます。
私は完全なフォークを作る方法が欲しい。したがって、フォークした後、新しいプロセスは前のプロセスと同じプロセスとスレッドを持ち、すべてのfd
sは正確なコピーです。たとえば、通常のファイルは正確なコピーです。 (ファイルパスも同じであるため、2つを望む場合、プロセスには同じパスを持つ2つの異なるファイルがあり、異なる名前空間にある必要がありますか?)サーバーソケットには同じコピーがあります(両方とも競合せずに同じポートをリッスンします。プロセスは異なる名前空間になければなりません(dockerについてのみ知っています))他のすべてはfd
できるだけシームレスです。また、フォークが書き込み中にコピーされるようにしたいので、ファイルブロックのコピーとメモリのコピーはページに書き込むときにのみ行われます(プロセスがアドレスmmap
空間全体を編集したことを考慮すると(これはJavaが行うことです)!)open
ed 100G rawディスクファイル(fdisk?)、この要件は意味があります。また、フォークされた新しいプロセスは再フォークできる必要があります。
Linuxの私の狭い理解は、プロセスの完全な複製を可能にします(どんなプロセスがそれ自体で行うかは他のfd
プロセスを妨げません)。
誰もがアイデアを持っているか、いくつかの実装がすでに存在していますか?現在、私はシステムコールを傍受するためにlibcでハッキングするつもりです。これはあまりにもハッキングです...またはptraceがプログラム的に遅いようですが、システムコールを傍受するためにptraceを使用することもできますsyscall
。
何百もの異なるLinuxシステム呼び出しがあり、ただ1つのプログラム呼び出し、、、、、、、、、「... 」をopen
考えると、この質問に対する簡単な答えはないようです。簡単な仕事。mmap
lseek
fcntl
socket
setsockopt
ioctl
clone
shmat
編集:問題を回避するには新しいプロセスに同じがpid
必要であるため、dockerまたはpid名前空間も必要です。