#define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include #include "err.h" #ifndef BUFSIZE #define BUFSIZE 1024 #endif // Lit les fichiers donnés en argument, ou l'entrée standard si aucun // argument n'est donné, et réécrit sur la sortie standard. // Si on compile avec -DWITH_SYNC, les écritures se font en mode // O_SYNC, s'il est implémenté. On observe un ralentissement // important. On observe aussi un ralentissement pour de petites // tailles de buffer. Le temps d'exécution s'améliore jusqu'à une // taille dépendant du système. int main(int argc, char **argv) { int d, d2 = STDOUT_FILENO; char buf[BUFSIZE]; ssize_t nb_read; for (int i = 0; i < argc ; i++) { if (argc == 1) d = STDIN_FILENO; else if (i == 0) continue; else if ((d = open(argv[i], O_RDONLY)) < 0) FATAL("open"); // Test avec O_SYNC (sous linux actuel, implémenté sous ext2fs). #ifdef WITH_SYNC int mode; if ((mode = fcntl(d2, F_GETFL)) < 0) FATAL("fcntl"); mode |= O_SYNC; if (fcntl(d2, F_SETFL, mode) < 0) FATAL("fcntl"); #endif while ((nb_read = read(d, buf, BUFSIZE)) > 0) if (write(d2, buf, nb_read) < 0) FATAL("write"); } return EXIT_SUCCESS; }