#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

// définition de la granularité des lectures/écritures
#define SIZE 10000

int main(int argc,char *argv[]) {
  int r;
  int w;
  char t[SIZE];
  ssize_t lus;

  r = open("a.data",O_RDONLY); // appel système pour ouvrir un fichier : -1 si échec
  if (r==-1) {
    perror("a.data");
    exit(1);
  }
  // ouverture en écriture et troncature, création si nécessaire, donc spéficification des droits
  // d'accès qui seront associés au fichier nouvellement créé, ici on demande rw-r--r--
  w = open("b.data",O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
  if (w==-1) {
    close(r);
    perror("b.data");
    exit(1);
  }
  while ((lus=read(r,t,SIZE*sizeof(char)))>0) { // lecture de SIZE octets
    write(w,t,lus); // écriture du nombre d'octets effectivement lus
  }
  close(w); // relâchement des ressources
  close(r);
  exit(0); // sortie en mode succès!
}