< EDITAR
Se este for o Linux, você também pode usar um truque gdb
. Mas acontece que podemos descartar esse truque no OS X, porque ele depende do comportamento específico do Linux de /dev/fd/
( /proc/self/fd/
).
É tudo o que sei, não tenho uma sugestão positiva.
Poderia dar horrivelmente errado, mas você considerou gdb
? Dois milagres em um pacote: um interpretador de C e uma maneira de injetar código no processo de sua escolha! Aparentemente, você também pode usá-lo para depuração.
Felizmente, a biblioteca padrão C também inclui uma função que interpreta scripts. A linguagem de script na sua plataforma pode ser mais conveniente para escrever do que C ...
Eu pensei em um script que usa less
para o OS X. Este é um hack frágil para voltar ao início do arquivo de log baseado em OS X, bash: menos funciona em descritores de arquivos abertos, o gato não Depois de ler todo o log arquivo com less
, a posição FD deve estar no final do arquivo, que é esperançosamente a posição original antes de nos intrometermos nele.
< EDIT > Mas só funciona se o arquivo também estiver aberto para leitura. De acordo com a sua saída de lsof
, o arquivo estava aberto apenas para gravação.
gdb -p 264 <<EOF
call (int) system("exec </dev/null >/tmp/log 2>&1; less /dev/fd/20")
EOF
Eu transmito o tipo de retorno, porque senão meu sistema reclamou que não sabia o tipo de retorno de system()
. Presumivelmente, isso também significa que ele não tinha certeza dos tipos de argumentos, então isso já está soando como uma ótima idéia.
Usar o system()
para manipular os descritores de arquivos de alguma forma funcionou quando tentei na minha caixa do Linux ... uma vez. Eu não prometo que sempre funcionará :). Por exemplo, tecnicamente, isso não é garantido como seguro se o programa estiver executando um manipulador de sinal ou mesmo system()
. ( system()
não é uma das poucas funções que garantidamente serão "reentrantes").