Eu descobri que se eu transferir uma grande quantidade de dados entre dois processos via pipe, algum arquivo temporário será criado pelo linux no diretório / tmp. Se a operação do pipe for bem-sucedida, o arquivo temporário correspondente será removido automaticamente pelo SO. Mas se a operação falhar, o arquivo tmp permanece lá.
Por alguma razão, não quero que o usuário tenha a oportunidade de obter os dados que transferi através do canal, por isso não quero nada no disco rígido, mesmo que o meu programa tenha travado. Como posso fazer isso?
sender > filename
thenreceiver < filename
. Eu verificaria o arquivo tmp durante as duas operações, para ver se o remetente ou o destinatário está fazendo isso.mkfifo
canal criado nunca faz buffer (de todo!) E nunca cria arquivos.Respostas:
pipes não armazenam dados no disco. / bin / eco foo | A barra grep não cria nenhum arquivo. tente
strace -f sh -c '/bin/echo foo | grep bar'
ver todas as chamadas do sistema feitas por um shell ao executar um pipeline.echo
é um shell embutido, então sugeri/bin/echo
que o shell executasse um executável./tmp
não precisa estar no disco. Pode ser montado em tmpfs (isto é, suportado pela memória virtual). Observe que a reinicialização ficará vazia/tmp
nesse caso; portanto, use/var/tmp
para qualquer coisa que você queira deixar por aí.Se o que você está fazendo é colocar dados em um arquivo, não está usando um pipe. Se o arquivo é um fifo, não um arquivo normal, é apenas um encontro nomeado e não contém dados. Use ls -l para descobrir.
E observe que, se você deseja impedir que os usuários vejam o que está passando por pipes nos processos que eles possuem, você é basicamente o SOL, porque
strace
pode inspecionar tudo o que um processo faz que interage com qualquer coisa fora do processo, exceto a leitura / gravação de mmapped compartilhado memória.ltrace
é ainda mais invasivo. Se o seu programa for executado em sistemas nos quais o usuário local possui raiz, você não poderá detê-los. No Unix, o root pode fazer qualquer coisa e possui ferramentas poderosas para esse fim.fonte
Um canal verdadeiro é um bloco de memória no kernel, um buffer que é lido / gravado por alguns processos. Ele não cria arquivos em qualquer lugar.
Alguns aplicativos têm opções que alternam entre o uso de pipes (mais rápido, sem bater no disco, ocupa um pouco mais de memória) e o uso de arquivos temporários (ocupa um pouco menos de memória, permite que você possa ver os arquivos temporários, um pouco mais devagar).
gcc
é uma dessas aplicações, embora provavelmente outras sejam.fonte
Corte sujo: Criptografe os dados antes de enviá-los e decodifique-os ao receber, se você puder alterar os dois processos ...
fonte