Questo è un esempio banale che mostra come realizzare un applicazione UNIX in C che copia da un file sorgente a un file di destinazione.

Dopo aver compilato il programma:

gcc copyfile.c -o copyfile

L’applicazione copyfile può essere lanciata da terminale con:

./copyfile nomeFileSorgente.txt nomeFileDiDestinazione.txt

Ecco il codice sorgente di copyfile.c:

#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

#define BUFF_SIZE 4096                    // dimensione del buffer
#define OUTPUT_MODE 0700                  // bit di protezione per file di output

int main(int argc, char *argv[])          // argc è il numero di parametri presenti nella riga di comando che invoca il programma
                                          // argv è un array di puntatori ai parametri
{    
    int in_fd, out_fd;                   // descrittori dei file
    int rd_count, wt_count;              // contatori dei byte restituiti dalle chiamate read e write
    char buffer[BUFF_SIZE];
    
    if (argc != 3)    exit(1);            // controlla il numero di parametri nella riga di comando
    
    in_fd = open(argv[1], O_RDONLY);        // apre il file sorgente
    if (in_fd < 0)    exit(2);             // in caso di errore di apertura il programma termina
    out_fd = creat(argv[2], OUTPUT_MODE);   // crea il file di destinazione
    if (out_fd < 0) exit(3);               // in caso di errore nella creazione del file il programma termina
    
    while (1)    // condizione sempre vera
    {
        rd_count = read(in_fd, buffer, BUFF_SIZE);    // legge un blocco di dati
        if (rd_count <= 0)    break;               // in caso di errore o se arriva alla fine del file il programma termina
        wt_count = write(out_fd, buffer, rd_count);   // scrive i dati
        if (wt_count <= 0)    exit(4);             // in caso di errore nella scrittura dei file il programma termina
    }
    
    close(in_fd);                   // chiude il file sorgente
    close(out_fd);                  // chiude il file di destinazione
    
    if (rd_count == 0)    exit(0);  // esce senza segnalare errori
    else            exit(3);        // esce con un errore nell'ultima lettura
}

About OpenProgrammers

Programmatore per passione. Mi piace condividere qualsiasi idea o informazione utile, per questo motivo ho realizzato il blog.