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; }