전체 프로세스의 정확한 사본을 만드시겠습니까?

전체 프로세스의 정확한 사본을 만드시겠습니까?

fork()프로세스를 포크하지만 모든 스레드를 복사하지도 않고 모든 s의 복제본을 생성하지도 않습니다 fd. fds는 부모와 자식 간에 공유됩니다.

나는 완전한 포크를 만드는 방법을 원합니다. 따라서 포크한 후 새 프로세스는 이전 프로세스와 동일한 프로세스 및 스레드를 가지며 모든 fds는 정확한 복사본입니다. 예를 들어 일반 파일은 정확한 복사본입니다. (파일 경로도 동일하기를 원하므로 두 개를 원하면 프로세스에는 동일한 경로를 가진 두 개의 서로 다른 파일이 있으며 서로 다른 네임스페이스에 있어야 합니다. 그렇죠?) 서버 소켓에는 동일한 복사본이 있습니다(둘 다 충돌하지 않고 동일한 포트를 수신합니다. 프로세스는 서로 다른 네임스페이스에 있어야 합니다(docker에 대해서만 알고 있습니다). )) 그 밖의 모든 것은 fd최대한 원활하게 진행됩니다. 또한 포크가 쓰기 중 복사가 되기를 원하므로 파일 블록의 복사와 메모리의 복사는 페이지에 쓸 때만 수행됩니다(프로세스가 mmap전체 주소 공간을 편집했다는 점을 고려하면(이것이 Java가 수행하는 작업입니다) !) 및 opened 100G 원시 디스크 파일(fdisk?), 이 요구 사항은 의미가 있습니다. 또한 포크된 새 프로세스는 다시 포크할 수 있어야 합니다.

Linux에 대한 나의 좁은 이해로 인해 프로세스의 완전한 복제가 가능합니다(어떤 프로세스가 자체적으로 수행하는 작업 fd도 다른 프로세스를 방해하지 않습니다).

누구든지 아이디어가 있거나 일부 구현이 이미 존재합니까? 현재 저는 시스템 호출을 가로채기 위해 libc에서 해킹을 할 생각입니다. 그건 너무 해킹입니다... 또는 ptrace가 프로그래밍 방식으로 느린 것처럼 보이지만 시스템 호출을 가로채기 위해 ptrace를 사용할 수도 있습니다 syscall.

수백 가지의 서로 다른 Linux 시스템 호출이 있고 단 하나의 프로그램 호출 open, mmap, lseek, fcntl, socket, setsockopt, ioctl, ``... 을 고려하면 이 질문에 대한 쉬운 대답은 없을 것 같습니다 clone. shmat쉬운 일 .

편집: 문제를 방지하려면 새 프로세스에 동일한 pid가 있어야 하므로 docker 또는 pid 네임스페이스도 필요합니다.

관련 정보