Files
BUT2/TP_SCR3.1/TP_Fichiers/cp_syscall.c

50 lines
2.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <stdio.h> // pour perror() et printf() : fonctions daffichage
#include <stdlib.h> // pour exit() : permet de quitter le programme en cas derreur
#include <fcntl.h> // pour open() : ouverture de fichiers
#include <unistd.h> // pour read(), write(), close() : appels systèmes bas niveau
int main() {
int source, dest; // "descripteurs de fichiers" : nombres entiers utilisés par le système
char c; // variable qui va contenir un caractère (1 octet) lu depuis le fichier
// Ouvrir le fichier source en lecture seule (O_RDONLY)
source = open("source.txt", O_RDONLY);
if (source < 0) { // si la valeur < 0, cest que louverture a échoué
perror("Erreur ouverture source"); // affiche lerreur système
exit(1); // quitte le programme avec un code derreur
}
// Créer (si nexiste pas) ou ouvrir le fichier destination en écriture
// O_WRONLY = écriture seule
// O_CREAT = créer le fichier si nexiste pas
// O_TRUNC = vider le fichier sil existe déjà
// 0644 = permissions du fichier (rw-r--r--)
dest = open("dest.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (dest < 0) { // si louverture échoue
perror("Erreur ouverture destination");
close(source); // on ferme quand même le fichier source ouvert
exit(1);
}
// Lire et écrire le fichier octet par octet
// read(source, &c, 1) lit 1 octet du fichier source et le stocke dans c
// la boucle continue tant que read() lit bien 1 octet
while (read(source, &c, 1) == 1) {
// écrire cet octet dans le fichier destination
if (write(dest, &c, 1) != 1) { // si write() échoue
perror("Erreur écriture");
close(source);
close(dest);
exit(1);
}
}
// Fermer les deux fichiers
close(source);
close(dest);
// Indiquer à lutilisateur que tout sest bien passé
printf("Copie terminée (méthode appels système).\n");
return 0; // programme terminé correctement
}