next up previous
Next: Controlul terminalului Up: Operatii de intrare/iesire (I/O) Previous: dirfd

Exemple

Vom prezenta in continuare doua exemple care sa reflecte utilizarea operatiilor sincrone si a celor de lucru pe directoare.

Primul exemplu este o versiune simplificata a utilitarului cat (denumit mycat).

/*
 * mycat.c - versiune simplificata a utilitarului cat pentru afisarea
 *           continutului unui fisier
 */

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

#define BUF_SIZE     1024          /* dimensiunea buffer-ului */

int main (int argc, char **argv)
{
        int fd;                    /* descriptorul de fisier */
        char buf[BUF_SIZE];        /* buffer pentru citire */
        int n_bytes;               /* contorul pentru octeti cititi */

        /*
         * trebuie sa avem un singur argument din linie de comanda:
         * numele fisierului care dorim sa-l afisam
         */
        if (argc != 2) {
                fprintf (stderr, "Numar necorespunzator de argumente.\n");
                exit (EXIT_FAILURE);
        }

        /* deschidem fisierul cu numele primit ca parametru */
        fd = open (argv[1], O_RDONLY);
        if (fd < 0) {
                perror ("open");
                exit (EXIT_FAILURE);
        }

        /*
         * citim din fisier in ciclu infinit; ne oprim atunci cand
         * am atins sfarsitul fisierului
         */
        while (1) {
                n_bytes = read (fd, buf, BUF_SIZE);
                if (n_bytes < 0) {
                        perror ("read");
                        exit (EXIT_FAILURE);
                }

                /* am atins sfarsitul fisierului */
                if (n_bytes == 0)
                break;

                /*
                 * afisam buffer-ul la iesirea standard; afisam cati
                 * octeti am citit
                 */
                write (STDOUT_FILENO, buf, n_bytes);
        }

        close (fd);/* inchidem fisierul */

        return 0;
}

Cel de-al doilea exemplu este o versiune simplificata a utilitarului ls (denumit myls).

/*
 * myls.c - versiune simplificata a utilitarului ls pentru afisarea
 *          continutului unui director
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>

int main (int argc, char **argv)
{
        DIR *dir;                /* structura pentru stream-ul director */
        struct dirent *dirent;   /* intrarea dintr-un director */

        /*
         * verificam numarul de argumente din linia de comanda;
         * daca nu avem nici un argument (argc == 1) atunci
         * se va afisa continutul directorului curent (".")
         * daca avem un argument atunci acesta va fi directorul
         * al carui continut il vom afisa;
         * daca avem mai multe argumente se considera eroare
         */
        switch (argc) {
        case 1:
                dir = opendir (".");
                if (dir == NULL) {
                        perror ("opendir");
                        exit (EXIT_FAILURE);
                }
                break;

        case 2:
                dir = opendir (argv[1]);
                if (dir == NULL) {
                        perror ("opendir");
                        exit (EXIT_FAILURE);
                }
                break;

        default:
                fprintf (stderr, "Numar necorespunzator de argumente.\n");
                exit (EXIT_FAILURE);
        }

        /*
         * avem directorul deschis si incepem sa citim toate intrarile
         * din cadrul acestuia si sa le afisam la iesirea standard;
         * ne oprim in momentul in care citim NULL, adica am ajuns
         * la sfarsitul stream-ului director
         */
        while (1) {
                dirent = readdir (dir);
                if (dirent == NULL) /* am ajuns la sfarsit */
                        break;

                /* afisam informatia la iesirea standard */
                write (STDOUT_FILENO, dirent->d_name, strlen (dirent->d_name));
                write (STDOUT_FILENO, "\n", 1);
        }

        closedir (dir);

        return 0;
}



Razvan Adrian Deaconescu 2005-10-01