2010-05-30 5 views
6

Así que tengo algunos datos temporales en mi programa (en RAM). Quiero de alguna manera hacer que parezca como si fuera un archivo (por ejemplo, para enviarlo a otro programa que toma un enlace de archivo como argumento)?¿Cómo tratar los datos RAM como si fuera un archivo real?

¿Es posible?

¿Cómo hacer tal cosa?

+6

¿Qué sistema operativo está ejecutando? –

+0

Uso el sistema operativo Windows 7 OS – Rella

+2

¿Qué ocurre con solo escribir los datos en un archivo "real" y enviar ese archivo como argumento? –

Respuesta

1

usted puede hacerlo en C usando la función popen():

FILE *f = popen("program args", "w"); 
// write your output to f here using stdio 
pclose(f); 

Esto es posible si su programa externo lee su entrada de stdin.

+3

popen no es C, es POSIX. –

+0

@Billy ONeal: Es cierto, pero cualquier implementación de propósito general de C ofrece una función 'popen()' (aunque podría llamarse '_popen()' como en MSVC). –

+0

Esto también asume que el OP desea ejecutar/iniciar el programa externo desde dentro del que contiene los datos. Sin embargo, esta solución es resbaladiza. –

0

Se puede usar tubería()

 
The pipe() function shall create a pipe and place two file descriptors, 
one each into the arguments fildes[0] and fildes[1], that refer to the 
open file descriptions for the read and write ends of the pipe. Their 
integer values shall be the two lowest available at the time of the 
pipe() call. The O_NONBLOCK and FD_CLOEXEC flags shall be clear on both 
file descriptors. (The fcntl() function can be used to set both these 
flags.) 
+0

No es una función de Windows (ver comentario a pregunta) – MSalters

+0

Sí, me di cuenta de que antes de que se editara la pregunta no se especificó ningún sistema operativo – hhafez

+0

Aunque estoy de acuerdo en que no es la forma de hacerlo de Windows todavía es posible usar funciones POSIX como pipe en Windows (por ejemplo, usando Cygwin) pero acepto que esta no es la respuesta que daría para Windows – hhafez

0

Sí, es posible. Puede transferir sus datos a su otra aplicación a través de un mecanismo interprocess communication:

  1. Según su sistema operativo, tiene diferentes opciones aquí. Podría crear una tubería, como han mencionado otros carteles aquí, ya que muchos sistemas operativos tienen tuberías.
  2. También podría usar la memoria compartida.
  3. Simplemente puede escribirlo en un archivo y luego abrirlo en su otra aplicación.
  4. Muchos sistemas operativos tienen otras técnicas que puede utilizar.

EDIT: MSDN muestra todos los mecanismos IPC disponibles para Windows here.

+0

¿Qué procesos están intercomunicando? La respuesta no tiene sentido. – samoz

+0

@samoz: el OP describe dos programas: el que tiene los datos en la RAM que quiere enviar y el otro que necesita recibir esos datos. Programa == proceso cuando se ejecutan en el sistema operativo. –

11

Si es compatible con su sistema operativo (los sistemas Unixoid y Windows lo hacen), puede intentar usar memory-mapped files.

+0

+1. De esta forma, los datos no se copian a menos que el SO decida que debe ser así. – MSalters

15

¿Por qué no simplemente escribir el archivo en el disco? Si escribir en el disco es demasiado lento, puede pasar el indicador FILE_ATTRIBUTE_TEMPORARY al CreateFile para mantener los datos en el caché (y evitar escribirlos en el dispositivo físico).

A veces las soluciones obvias son las mejores ...

+1

Esta es la forma correcta de hacerlo. +5 si es posible. – samoz

+0

+1 Pero supongo que es una cuestión de cuán grande es el caché y el archivo, ¡y esperando que el primero sea más grande que el segundo! – mdma

+1

@mdma: cierto, pero si la memoria caché es demasiado pequeña para caber en el archivo, entonces podría argumentar que probablemente no sea bueno mantener el archivo completo en la memoria en primer lugar. Lo bueno de 'FILE_ATTRIBUTE_TEMPORARY' es que si no hay suficiente espacio en la memoria caché, seguirá usando el sistema de archivos para que no tenga que preocuparse. –

Cuestiones relacionadas