fork()
프로세스를 포크하지만 모든 스레드를 복사하지도 않고 모든 s의 복제본을 생성하지도 않습니다 fd
. fd
s는 부모와 자식 간에 공유됩니다.
나는 완전한 포크를 만드는 방법을 원합니다. 따라서 포크한 후 새 프로세스는 이전 프로세스와 동일한 프로세스 및 스레드를 가지며 모든 fd
s는 정확한 복사본입니다. 예를 들어 일반 파일은 정확한 복사본입니다. (파일 경로도 동일하기를 원하므로 두 개를 원하면 프로세스에는 동일한 경로를 가진 두 개의 서로 다른 파일이 있으며 서로 다른 네임스페이스에 있어야 합니다. 그렇죠?) 서버 소켓에는 동일한 복사본이 있습니다(둘 다 충돌하지 않고 동일한 포트를 수신합니다. 프로세스는 서로 다른 네임스페이스에 있어야 합니다(docker에 대해서만 알고 있습니다). )) 그 밖의 모든 것은 fd
최대한 원활하게 진행됩니다. 또한 포크가 쓰기 중 복사가 되기를 원하므로 파일 블록의 복사와 메모리의 복사는 페이지에 쓸 때만 수행됩니다(프로세스가 mmap
전체 주소 공간을 편집했다는 점을 고려하면(이것이 Java가 수행하는 작업입니다) !) 및 open
ed 100G 원시 디스크 파일(fdisk?), 이 요구 사항은 의미가 있습니다. 또한 포크된 새 프로세스는 다시 포크할 수 있어야 합니다.
Linux에 대한 나의 좁은 이해로 인해 프로세스의 완전한 복제가 가능합니다(어떤 프로세스가 자체적으로 수행하는 작업 fd
도 다른 프로세스를 방해하지 않습니다).
누구든지 아이디어가 있거나 일부 구현이 이미 존재합니까? 현재 저는 시스템 호출을 가로채기 위해 libc에서 해킹을 할 생각입니다. 그건 너무 해킹입니다... 또는 ptrace가 프로그래밍 방식으로 느린 것처럼 보이지만 시스템 호출을 가로채기 위해 ptrace를 사용할 수도 있습니다 syscall
.
수백 가지의 서로 다른 Linux 시스템 호출이 있고 단 하나의 프로그램 호출 open
, mmap
, lseek
, fcntl
, socket
, setsockopt
, ioctl
, ``... 을 고려하면 이 질문에 대한 쉬운 대답은 없을 것 같습니다 clone
. shmat
쉬운 일 .
편집: 문제를 방지하려면 새 프로세스에 동일한 pid
가 있어야 하므로 docker 또는 pid 네임스페이스도 필요합니다.