Pipe deve scrivere un file temporaneo?


11

Ho scoperto che se trasferisco una grande quantità di dati tra due processi tramite pipe, alcuni file temporanei verranno creati da linux nella directory / tmp. Se l'operazione di pipe ha esito positivo, il file temporaneo corrispondente verrà rimosso automaticamente dal sistema operativo. Ma se l'operazione non è riuscita, il file tmp rimane lì.

Per qualche motivo, non voglio che l'utente abbia l'opportunità di ottenere i dati che ho trasferito tramite pipe, quindi non voglio che nulla rimanga sul disco fisso anche se il mio programma si è bloccato. Come posso fare questo?


4
Sono molto dubbioso che sia il sistema operativo che crea questi file, in particolare, dubito che sia l'operazione pipe.

@Neil: ottimo punto. @OP: sei sicuro che il destinatario non stia memorizzando nella cache i dati che riceve su stdin nel file tmp? Se non è il tuo codice e non è open source, puoi probabilmente controllare reindirizzando l'output dal tuo mittente a un file e quindi inviandolo al processo del ricevitore come flusso di input, ad esempio: sender > filenamethen receiver < filename. Controllerei il file tmp durante entrambe le operazioni, per vedere se il mittente o il destinatario lo stanno facendo.

2
Non una risposta, ma ho trovato molte informazioni utili sulla gestione dei tubi qui: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. Non so quanto sia autorevole questa persona, ma menziona specificamente che una mkfifopipe creata non fa mai buffering (affatto!) E non crea mai file.
Carl Smotricz,

1
@Carl Smotricz: Il collegamento è interrotto, quindi qui: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

Inoltre, scrivere su una pipe si bloccherà se la pipe è troppo piena (fino a quando qualcuno non legge dall'altra estremità).

Risposte:


11
  1. le pipe non memorizzano i dati sul disco. / bin / echo foo | barra grep non crea alcun file. provare strace -f sh -c '/bin/echo foo | grep bar' a vedere tutte le chiamate di sistema fatte da una shell quando si esegue una pipeline. echoè incorporato nella shell, quindi ho suggerito /bin/echodi far funzionare la shell come eseguibile.

  2. /tmpnon deve essere su disco. Può essere montato su tmpfs (ovvero supportato da memoria virtuale). Si noti che un riavvio verrà svuotato /tmpin quel caso, quindi utilizzare /var/tmpper tutto ciò che si desidera lasciare in giro.

Se quello che stai facendo è mettere i dati in un file, allora non sta usando una pipe. Se il file è un FIFO, non un file normale, allora è solo un appuntamento chiamato e non contiene dati. Usa ls -l per scoprirlo.

E nota che se speri di impedire agli utenti di vedere cosa sta attraversando le pipe nei processi di loro proprietà, sei praticamente SOL, perché stracepuò ispezionare tutto ciò che fa un processo che interagisce con qualsiasi cosa al di fuori del processo, ad eccezione della lettura / scrittura condivisa memoria. ltraceè ancora più invasivo. Se il tuo programma verrà eseguito su sistemi in cui l'utente locale ha root, non puoi fermarli affatto. Su Unix, root può fare qualsiasi cosa e ha potenti strumenti per lo scopo.


1

Una vera pipe è un blocco di memoria nel kernel, un buffer che viene letto / scritto da alcuni processi. Non crea file da nessuna parte.

Alcune app hanno opzioni che cambiano tra l'utilizzo di pipe (più veloce, senza colpire il disco, richiede un po 'più di memoria) e l'uso di file temporanei (richiede un po' meno memoria, consente di vedere i file temporanei, un tocco più lento). gccè una di queste applicazioni, sebbene probabilmente ne siano altre.


0

Hack sporco: crittografare i dati prima di inviarli e decrittografarli alla ricezione se è possibile modificare entrambi i processi ...


In realtà non lo definirei un trucco sporco: se i dati sono sensibili, sembra una soluzione appropriata. Ma sono curioso del file tmp. L'OP ha ragione quando il kernel lo sta creando? O ha ragione Neil ed è un'estremità del tubo o l'altra ...

Il kernel non sta creando un file temporaneo. D'altra parte, è molto probabile che il processo di ricezione stia creando un file temporaneo. Questo è abbastanza comune, poiché se si desidera cercare nel proprio input è necessario prima scriverlo in un file.
Larks,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.