Ecrire simultanément sur deux stream

Existe-t-il un moyen de coupler deux stream (ou descripteurs de fichiers) ensemble pour que l’écriture sur un stream écrive également sur le second? (C, Linux)

Merci.

L’utilisateur laalto est correct, mais sous Linux, la fonction que vous recherchez s’appelle fopencookie . Corriger l’exemple de laalto pour Linux aboutit à:

 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 ... 

Lorsque vous écrivez sur f , le système exécute votre fonction my_writefn transmettant les données transmises à fwrite . Pour faciliter les choses, vous pouvez également modifier la mise en mémoire tampon pour que votre stream de fichiers soit orienté ligne:

 setvbuf(f, NULL, _IOLBF, 0); 

Cela sauvegardera les données transmises à fwrite jusqu’à ce qu’une nouvelle ligne soit sortie ou que des données soient lues depuis n’importe quel stream attaché aux processus (par exemple, stdin). REMARQUE: vous devez appeler sevbuf après fopencookie mais avant que des données ne soient écrites dans le stream.

J’utilise la mise en tampon de ligne car j’utilise généralement fopencookie pour redirect stderr vers syslog, ou via un socket réseau, et le traitement des données orientées ligne est plus simple et plus efficace.

Utilisez funopen ou fwopen et fournissez votre propre fonction d’écriture qui écrit dans plusieurs FILE* .

Exemple:

 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]); } 

(Gestion des erreurs omise.)

Notez que funopen et fwopen sont BSD et non pas sous Linux standard. Je ne sais pas s’il existe un équivalent compatible Linux.

La première chose qui m’est venue à l’esprit était aussi “tee”. Alors, combinons C et le shell avec popen:

 FILE * multi_out; multi_out = popen( "tee file1.out > file2.out", "w"); /* error checks, actual work here */ pclose( multi_out); /* error checks here */ 

En tant qu’Unix bigot, j’ai supposé que vous n’essayiez pas cela sous Windows.

Vous ne savez pas si c’est ce que vous voulez, mais «tee» dans Unix fait quelque chose de similaire.

Vous pouvez implémenter quelque chose de similaire aux fonctionnalités de tee avec boost :: iostreams .