¿Hay alguna manera de unir dos flujos (o descriptores de archivos) para que la escritura en una secuencia también escriba en la segunda? (C, Linux)Escribir simultáneamente en dos flujos
Gracias.
¿Hay alguna manera de unir dos flujos (o descriptores de archivos) para que la escritura en una secuencia también escriba en la segunda? (C, Linux)Escribir simultáneamente en dos flujos
Gracias.
Usuario laalto es correcto, pero en Linux, la función que está buscando se llama fopencookie
. Corrección de ejemplo laalto para Linux se traduce en:
int my_writefn(void *cookie, const char *data, int n) {
FILE **files = (FILE **)cookie;
fwrite(data, n, 1, files[0]);
return fwrite(data, n, 1, files[1]);
}
int noop(void) { return 0; }
cookie_io_functions_t my_fns = {
(void*) noop,
(void*) my_writefn,
(void*) noop,
(void*) noop
};
FILE *files[2] = ...;
FILE *f = fopencookie((void *)files, "w", my_fns);
// ... use f as you like ...
Cuando se escribe a f
, el sistema ejecutará su función my_writefn
pasándole los datos que se pasa a fwrite
. Para facilitar las cosas, es posible que también desea cambiar el búfer para su flujo de archivos a orientarse línea:
setvbuf(f, NULL, _IOLBF, 0);
que amortigüe los datos pasados a fwrite
hasta que una nueva línea es la salida o cualquier Los datos se leen desde cualquier flujo adjunto a los procesos (por ejemplo, stdin). NOTA: debe llamar al sevbuf
después de fopencookie
pero antes de que se escriban datos en la transmisión.
Utilizo el buffering de línea porque normalmente uso fopencookie
para redirigir stderr a syslog, o sobre un socket de red, y el procesamiento de datos orientados a líneas es más fácil y más eficiente.
Puede implementar algo similar a la funcionalidad de tee
con boost::iostreams.
No estoy seguro si es lo que quiere, pero la 'tee' en Unix hace algo similar.
Así que el chico "C++" se modificó, pero se modded por sugerir que "construir en el trabajo de los demás". Eso no está bien ... – Roboprog
Lo primero que me vino a la mente fue también "camiseta". Por lo tanto, vamos a combinar C y la cáscara con popen:
FILE * multi_out;
multi_out = popen("tee file1.out > file2.out", "w");
/* error checks, actual work here */
pclose(multi_out);
/* error checks here */
Como un intolerante Unix, he asumido que no está intentando esto en Windows.
Use funopen
o fwopen
y proporcione su propia función de escritura que se escribe en múltiples FILE*
s.
Ejemplo:
FILE *files[2] = ...;
FILE *f = fwopen((void *)files, my_writefn);
// ... use f as you like ...
int my_writefn(void *cookie, const char *data, int n) {
FILE **files = (FILE **)cookie;
fwrite(data, n, 1, files[0]);
return fwrite(data, n, 1, files[1]);
}
(Gestión de errores omite.)
Tenga en cuenta que funopen
y fwopen
son BSD y no en Linux estándar. No sé si hay un equivalente compatible con Linux.
Aparentemente, no. No están en páginas man (al menos en mi sistema). – jackhab
funopen está en BSD y Mac OS X. En Linux, use fopencookie. – mark4o
@ mark4o: Gracias por la información. @Jack: Parece que la implementación con fopencookie() sería bastante similar. No estoy actualizando mi respuesta aquí, pero debería tener algunos consejos para seguir adelante. – laalto
¿Tiene un ejemplo para C? Porque eso es estrictamente C++;) – Skurmedel
lo siento probablemente no – stefanB