paulo1205
(usa Ubuntu)
Enviado em 29/08/2014 - 17:26h
Sam L. escreveu:
É possível ler a área de "code" de outro processo usando C no Linux? Eu queria usar isso num teste, tipo, quero interroper um processo e então reexecutá-lo usando system mas com alguns argumentos a mais, isso em processos de mesmo usuário.
Eu estou lendo o capítulo sobre processos no Beginning Linux Programming mas não vi nada relacionado ao que quero fazer.
Resposta curta: não, pois os processos são independentes uns dos outros. O que você poderia fazer seria comunicar um processo com outro por meio de sinais, sockets ou pipes.
Resposta longa: depende. Se você estiver efetuando o trace de um processo, semelhante ao que fazem o gdb ou strace, você pode interferir na memória e mesmo executar código como se fosse esse outro processo. Dentro do seu programa, eu não sei dizer exatamente como você faria. Contudo, eu já consegui usar, com sucesso, o gdb para interferir num processo que já estava em execução e que não podia ser interrompido, forçando-o a trocar o diretório corrente (ele estava usando uma área da rede que tinha de ser migrada). Foi simples assim:
echo 'call chdir("/tmp")' | gdb -p numero_do_processo
Note, porém, que
chdir() é uma chamada praticamente atômica ao kernel. Já tentei algumas outras estripulias, como
fork() e
malloc(), e acabei com programas que capotaram. Tentar executar coisas no meio do programa que ele não está preparado para tratar é sempre uma temeridade.
Se você quiser fazer sem o gdb, mas com um programa seu, provavelmente vai precisar estudar a função
ptrace. Olhando rapidamente a manpage, no entanto, não vi como fazer com que o programa execute a chamada a uma função, mas somente como ler/alterar valores de posições de memória e registradores.