Você deseja um mecanismo injeção de falhas para E / S.
No Linux, aqui está um método que não requer nenhuma configuração prévia e gera um erro incomum (não EIO “Erro de entrada / saída”, mas ESRCH “Nenhum tal processo”):
cat /proc/1234/mem
em que 1234 é o PID de um processo em execução como o mesmo usuário que o processo que você está testando, mas não esse processo em si. Créditos para rubasov para pensando de /proc/$pid/mem
.
Se você usar o PID do processo em si, obterá EIO, mas somente se estiver lendo de uma área que não esteja mapeada na memória do processo. A primeira página nunca é mapeada, então está tudo bem se você ler o arquivo sequencialmente, mas não é adequado para um processo de banco de dados que busca diretamente no meio do arquivo.
Com mais algumas configurações como root, você pode alavancar o mapeador de dispositivos para criar arquivos com setores válidos e setores defeituosos.
Outra abordagem seria implementar um pequeno sistema de arquivos FUSE . O EIO é o código de erro padrão quando o driver do sistema de arquivos do espaço do usuário faz algo errado, por isso é fácil de conseguir. Tanto o Perl quanto As ligações do Python vêm com exemplos para começar, você pode escrever rapidamente um sistema de arquivos que espelha os arquivos existentes, mas que injeta uma EIO em locais cuidadosamente escolhidos. Existe um sistema de arquivos existente: petardfs ( article ), eu não sei o quão bem funciona fora da caixa.
No entanto, outro método é o LD_PRELOAD
wrapper. Um já existente é o Libfiu (injeção de falhas no espaço do usuário). Ele funciona pré-carregando uma biblioteca que sobrecarrega as chamadas da API POSIX. Você pode escrever diretivas simples ou código C arbitrário para substituir o comportamento normal.