Isso não é possível “de forma limpa”. Existem ferramentas como tela e tmux que criam um terminal virtual remanescente: você pode iniciar seu programa dentro da tela, desanexar a sessão de tela e, posteriormente, reconectar a sessão de tela em um terminal diferente. Mas isso requer planejamento antecipado.
É possível usar ptrace para mexer com os descritores de arquivos do processo para reconectá-los a outro terminal. Isso não funciona de maneira confiável porque pode criar inconsistências nas estruturas de dados do processo: alguns programas não se importarão, outros falharão. Você pode fazer isso anexando o programa em um depurador e emitindo a seqüência correta de chamadas do sistema (pelo menos open, dup e close para cada entrada padrão, saída padrão e erro padrão). Existem várias ferramentas existentes que podem fazer isso, por exemplo neercs e retty .
Veja também Como posso pausar um processo em execução sobre o ssh, deserdá-lo, associá-lo a um novo shell de tela e desmarcá-lo? , Ver script sobre o SSH? , Posso nohup / tela de um processo já iniciado? , Retomar o comando em execução na sessão SSH descartada .
vi &separa o processo do terminal existente