Criando uma cópia exata de um processo inteiro?

0

fork() bifurca um processo, mas não copia todos os seus threads; nem criará um clone de todos os seus fd s: os fd s são compartilhados entre pai e filho.

Eu quero um jeito de fazer um fork completo. Então, depois de bifurcar, o novo processo tem o mesmo processo e threads que o processo antigo, e todos fd s são a cópia exata, por exemplo, arquivos normais são cópia exata (espero que os caminhos de arquivo sejam os mesmos, então se queremos dois processos para ter dois arquivos diferentes que são do mesmo caminho, eles devem estar em namespaces diferentes, certo?), soquetes de servidor são da mesma cópia (dois processos escutando na mesma porta enquanto nenhum conflito acontece deve estar em diferente namespaces (eu só sei docker)), e outros fd s são o mais parecido possível. Também espero que o bifurcação seja copy-on-write, portanto, copiar os blocos de arquivos e copiar na memória é feito apenas quando a escrita na página acontece (considerando um processo mmap ed todo o espaço de endereço (java faz isso! ) e open um arquivo de disco bruto de 100G (fdisk?), a demanda faz sentido); Além disso, o novo processo bifurcado deve poder ser novamente bifurcado.

No que diz respeito ao meu estreito conhecimento de linux, uma cópia completa de um processo só pode ser possível (qualquer operação de qualquer processo com seu próprio fd s não irá interferir com o outro), por exemplo, em diferentes estivadores. / p>

Alguém tem algumas ideias ou já existem implementações? Atualmente estou pensando em fazer hack na libc para interceptar syscalls, que é muito hacky ... alternativamente pode-se usar ptrace para interceptar syscalls embora ptrace pareça estar lento no programa syscall ing muito.

Eu acho que a pergunta não tem uma resposta simples, pois existem centenas de vários syscalls do Linux e apenas considerando um programa chamando open , mmap , lseek , fcntl , socket , setsockopt , ioctl , clone , shmat , '' ..., não parece ser uma tarefa fácil.

EDIT: o novo processo deve ter o mesmo pid s para evitar que algo seja quebrado, então espaços de nomes de docker ou pid também são necessários.

    
por Thiner 21.02.2018 / 02:23

0 respostas