O pipe precisa gravar um arquivo temporário?


11

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?


4
Eu tenho muita dúvida de que é o sistema operacional que está criando esses arquivos, particularmente, duvido que seja a operação de pipe.

@ Neil: Muito bom ponto. @OP: Tem certeza de que o receptor não está armazenando em cache os dados que recebe no stdin no arquivo tmp? Se não é seu próprio código e não é de código aberto, você provavelmente pode verificar redirecionando sua saída do remetente para um arquivo e enviando-a para o processo receptor como seu fluxo de entrada, por exemplo: sender > filenamethen receiver < filename. Eu verificaria o arquivo tmp durante as duas operações, para ver se o remetente ou o destinatário está fazendo isso.

2
Não é uma resposta, mas encontrei muitas informações úteis sobre o manuseio de tubos aqui: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. Não sei o quão autoritária essa pessoa é, mas ele menciona especificamente que um mkfifocanal criado nunca faz buffer (de todo!) E nunca cria arquivos.
22630 Carl Smotricz

1
@Carl Smotricz: O link está quebrado, então aqui: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

Além disso, a gravação em um tubo bloqueará se o tubo estiver muito cheio (até que alguém leia do outro lado).

Respostas:


11
  1. 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/echoque o shell executasse um executável.

  2. /tmpnão precisa estar no disco. Pode ser montado em tmpfs (isto é, suportado pela memória virtual). Observe que a reinicialização ficará vazia /tmpnesse caso; portanto, use /var/tmppara 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 stracepode 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.


1

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.


0

Corte sujo: Criptografe os dados antes de enviá-los e decodifique-os ao receber, se você puder alterar os dois processos ...


Na verdade, não seria um hack sujo: se os dados forem sensíveis, parece uma solução apropriada. Mas estou curioso sobre o arquivo tmp. O OP está certo em que o kernel o está criando? Ou é Neil direito e é uma extremidade do tubo ou o outro ...

O kernel não está criando um arquivo temporário. Por outro lado, é muito provável que o processo de recebimento esteja criando um arquivo temporário. Isso é bastante comum, pois se você deseja procurar na sua entrada, precisa gravá-la em um arquivo primeiro.
Larsks 11/12/2009
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.