¿Pipe tiene que escribir un archivo temporal?


11

Descubrí que si transfiero una gran cantidad de datos entre dos procesos a través de una tubería, linux creará un archivo temporal en el directorio / tmp. Si la operación de canalización tiene éxito, el sistema operativo eliminará automáticamente el archivo temporal correspondiente. Pero si la operación falla, el archivo tmp permanece allí.

Por alguna razón, no quiero que el usuario tenga la oportunidad de obtener los datos que transferí a través de la tubería, por lo que no quiero que quede nada en el disco duro, incluso si mi programa falla. ¿Cómo puedo hacer esto?


44
Dudo mucho que sea el sistema operativo el que crea estos archivos, particularmente, dudo que sea la operación de canalización.

@Neil: Muy buen punto. @OP: ¿Está seguro de que el receptor no está almacenando en caché los datos que recibe en stdin en el archivo tmp? Si no es su propio código y no es de código abierto, probablemente pueda verificarlo redirigiendo su salida de su remitente a un archivo y luego enviándolo al proceso del receptor como su flujo de entrada, por ejemplo: sender > filenameentonces receiver < filename. Verificaría el archivo tmp durante ambas operaciones, para ver si el remitente o el receptor lo están haciendo.

2
No es una respuesta, pero encontré mucha información útil sobre el manejo de tuberías aquí: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. No sé cuán autoritaria es esta persona, pero menciona específicamente que una mkfifotubería creada nunca crea ningún almacenamiento intermedio (¡en absoluto!) Y nunca crea archivos.
Carl Smotricz

1
@Carl Smotricz: el enlace está roto, así que aquí: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

Además, escribir en una tubería bloqueará si la tubería está demasiado llena (hasta que alguien lea desde el otro extremo).

Respuestas:


11
  1. las tuberías no almacenan datos en el disco. / bin / echo foo | grep bar no crea ningún archivo. intente strace -f sh -c '/bin/echo foo | grep bar' ver todas las llamadas al sistema realizadas por un shell al ejecutar una canalización. echoes un shell incorporado, por lo que sugerí /bin/echohacer que el shell ejecute un ejecutable.

  2. /tmpno tiene que estar en el disco. Se puede montar en tmpfs (es decir, respaldado por memoria virtual). Tenga en cuenta que un reinicio se vaciará /tmpen ese caso, así que úselo /var/tmppara cualquier cosa que desee dejar.

Si lo que está haciendo es poner datos en un archivo, entonces no está usando una tubería. Si el archivo es un Fifo, no un archivo normal, entonces es solo una cita con nombre y no contiene datos. Use ls -l para averiguarlo.

Y tenga en cuenta que si espera evitar que los usuarios vean lo que pasa a través de las tuberías en los procesos que poseen, es prácticamente SOL, porque stracepuede inspeccionar todo lo que hace un proceso que interactúa con cualquier cosa fuera del proceso, excepto leer / escribir mmapped shared memoria. ltraceEs aún más invasivo. Si su programa se ejecutará en sistemas donde el usuario local tiene root, no puede detenerlos en absoluto. En Unix, root puede hacer cualquier cosa y tiene herramientas poderosas para este propósito.


1

Una tubería verdadera es un bloque de memoria en el núcleo, un búfer que algunos procesos leen / escriben. No crea archivos en ningún lado.

Algunas aplicaciones tienen opciones que cambian entre usar tuberías (más rápido, sin golpear el disco, toma un poco más de memoria) y usar archivos temporales (toma un poco menos de memoria, le permite ver los archivos temporales, un toque más lento). gcces una de esas aplicaciones, aunque probablemente sean otras.


0

Hack sucio: cifre los datos antes de enviarlos y descifrarlos al recibirlos si puede cambiar ambos procesos ...


En realidad, no lo llamaría un truco sucio: si los datos son confidenciales, parece una solución adecuada. Pero tengo curiosidad sobre el archivo tmp. ¿Es correcto el OP que el núcleo lo está creando? ¿O tiene razón Neil y es un extremo de la tubería o el otro ...

El kernel no está creando un archivo temporal. Por otro lado, es muy probable que el proceso de recepción esté creando un archivo temporal. Esto es bastante común, ya que si desea buscar su entrada, primero debe escribirla en un archivo.
larsks
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.