Pergunta

Eu tenho um pequeno aplicativo de linha de comando escrito em C, que atua como um invólucro / lançador para outros programas (pense: xargs). O aplicativo é escrito para compilar no FreeBSD / Linux (via fork () / exec ()) e Windows (CreateProcess ()). Além de ser capaz de interceptar, injetar, ou manipular os argumentos de linha de comando para a aplicação criança, eu queria saber se existe uma maneira fácil de interceptar atividade sistema de arquivos do programa filho (ou os filhos, e assim por diante). Estou interessado principalmente em apenas os nomes dos arquivos acessados ??tanto para ler ou escrever, mas não o conteúdo dos referidos ficheiros, e gostaria que a interceptação de ser tão leve quanto possível.

Em pesquisando algumas palavras-chave relevantes de cima, parece que há muitas maneiras de fazer isso em Win32. De drivers de filtro do sistema de arquivos para adulterar cabeçalhos de tabela de importação PE. Nenhum destes parece trivial ou algo que eu poderia auto-conter dentro do meu programa envoltório executável (por exemplo, mais exigiria DLLs extras ou arquivos de driver junto com o executável principal.) Além disso, eu gostaria que isso funcione no Windows XP a 7, se possível , sem ter que cortar em torno UAC ou outros deltas plataforma. É o meu processo filho, então eu acho que eu deveria ser capaz de monitorar de forma segura sua actividade:)

No Linux, existe inotify (), mas ele monitora o acesso geral sistema de arquivos sem levar em conta apenas o meu processo criança / es. A mesma coisa vale para kqueue do FreeBSD (). Estes também quebrar em casos de SMP, onde várias instâncias do invólucro pode estar executando programas diferentes, e cada um precisa para disambiguate atividade sistema de arquivos de seu próprio filho de um outro.

Eu certamente apreciar quaisquer sugestões que a comunidade SO pode ter para oferecer.

Foi útil?

Solução

Escrever uma biblioteca "mediadora" que conecta a sua variável de ambiente LD_PRELOAD fopen e conjunto para todos os processos filhos. Isso funciona com bibliotecas ligadas dinamicamente tu.

Exemplo de como fazer isso podem ser encontrados aqui: http: // desenvolvedores. sun.com/solaris/articles/lib_interposers.html e http://lists.debian.org/debian-powerpc/2004/11/msg00039.html mostra uma aplicação parcial para fopen () interpositor ..

Outras dicas

A única sugestão que eu faria é usar strace (chamadas de sistema de rastreamento e sinais), embora este é mais uma ferramenta de depuração, e afeta o desempenho do processo que está sendo rastreada

strace -f -e trace=file -o <output-file> <cmd-line>

-f - follow forks
-e trace=file - will output system calls related to the file-system
-o <output-file>

IMHO -. Se você se familiarizar com strace, é sempre uma ferramenta útil para ter no arsenal

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top