fork()
fork一个进程,但它不会复制其所有线程;它也不会创建其所有 s 的克隆fd
:fd
s 在父级和子级之间共享。
我想要一种制作完整叉子的方法。所以在我fork之后,新进程与旧进程具有相同的进程和线程,并且所有fd
s都是精确的副本,例如普通文件是精确的副本(我希望甚至文件路径都是相同的,所以如果我们想要两个进程拥有两个具有相同路径的不同文件,它们必须位于不同的命名空间中,对吗?),服务器套接字具有相同的副本(在不发生冲突的情况下侦听同一端口的两个进程必须位于不同的命名空间中(我只知道docker)),其他的fd
都尽可能的无缝。我还希望分叉是写时复制的,因此仅当在页面上写入时才完成文件块的复制和内存上的复制(考虑到进程已经mmap
ed 整个地址空间(java 就是这样做的!)并且open
ed一个100G的原始磁盘文件(fdisk?),这个需求是有道理的);此外,分叉的新进程应该能够再次分叉。
就我对linux的狭隘了解而言,一个进程的完整复制是可能的(任何进程对其自身的任何操作fd
都不会干扰其他进程),例如在不同的docker中。
任何人都有一些想法,或者一些实现已经存在?目前我正在考虑在 libc 中进行 hack 来拦截系统调用,这太 hacky了...或者可以使用 ptrace 来拦截系统调用,尽管 ptrace 似乎在编程上很慢syscall
。
我想这个问题没有一个简单的答案,因为有数百个不同的 linux 系统调用,并且仅考虑一个程序调用open
, mmap
, lseek
, fcntl
, socket
, setsockopt
, ioctl
, clone
, shmat
, ``... ,这似乎不是一件容易的事。
编辑:新进程应该具有相同的pid
s 以避免出现问题,因此还需要 docker 或 pid 命名空间。