:orphan:
.. role:: raw-html(raw)
:format: html
CoPy
==========
:raw-html:`CoPy`
è un programma C il cui obiettivo è mostrare l'utilizzo di alcuni servizi per la gestione di file.
.. code-block:: c
:linenos:
#include
#include
#include
#include
#define BUFSIZE 250
#define abort(msg) do{printf(msg);exit(1);}while(0)
int main(int argc, char *argv[]) {
int ifd, ofd, size_r, size_w, end = 0;
char buffer[BUFSIZE];
/* check parameters */
if (argc != 3) abort("usage: copy \n");
/* open the input file and check errors */
ifd=open(argv[1],O_RDONLY);
if (ifd == -1) abort("input open error\n");
/* opend output file and check errors */
ofd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0660);
if (ofd == -1) abort("output creation error\n");
while(!end){
/* read up to BUFSIZE from input file and check errors */
size_r=read(ifd,buffer,BUFSIZE);
if (size_r == -1) abort("read error\n");
/* has EOF been reached? */
end = size_r == 0;
/* write BUFSIZE to destination file */
size_w = write(ofd,buffer,size_r);
if (size_w == -1) abort("write error\n");
printf("written: %d\n", size_w);
}
/* close file descriptors */
close(ifd);
close(ofd);
}
Il programma prende da riga di comando il file da copiare ed il file destinazione.
Lo schema è il seguente:
#. apre il file di input in lettura utilizzando il flag O_RDONLY (riga 18)
#. crea ed apre il file di output in sola scrittura tramite i flag O_CREAT e O_WRONLY, e, se già esistente, ne cancella il contenuto grazie al flag O_TRUNC (riga 22)
#. legge al più BUFSIZE byte su un buffer (riga 27)
#. utilizza il suddetto buffer per la scrittura su file di output (riga 34)
#. una volta letto e copiato tutto il file (riga 45) vengono chiusi i relativi file descriptor (riga 40 e 41)
.. warning::
Il codice mostrato è affetto da una problematica relativa alla fase di scrittura.
Nello specifico, è possibile che il programma termini correttamente senza però aver effettuato una corretta copia del file.
.. question_note::
* In quali scenari il programma presenta la suddetta anomalia?
* Come prevenirla?
Riferimenti
"""""""""""
* :posix:`open `
* :posix:`read `
* :posix:`write `
* :posix:`close `