Sistema Operatiu Linux

Unitat: Linux com a entorn de programació

Tema: ús de les funcions de baix nivell del sistema (API de 'C')


Introducció a l'ús de funcions del sistema en els programes 'C'
 



Funcions del sistema de fitxers: open


El primer exemple serà el programa crea.c que permet crear un fitxer amb uns certs permisos, utilitzant la funció de l'API de C open:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main(int argc, char *argv[1])
{
    open(argv[1],O_WRONLY | O_CREAT | O_TRUNC , S_IRWXU);
}

Seguim les següents passes:
1. Introduïr el text del programa en el fitxer crea.c
2. Compilar el programa: $ gcc crea.c -o crea.exe
3. El provem: $./crea.exe fitxer
4. Comprovem: ls -l fitxer
    _rwx_ _ _ _ _ _  fitxer

Explicació del programa:
 

Altres funcions del sistema de fitxers: mkdir, link


Exercicis:
1. Escriu un programa mdir.c per crear un directori amb permísos rwx per el propietari. El nom del directori és un paràmetre en línia del comandament.
2. Escriu un programa mlink.c per crear un vincle. El nom del fitxer i del vincle són paràmetres en línia del comandament.


Accés als directoris del sistema de fitxers: funcions opendir, readdir, closedir


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

main(int argc, char *argv[])
{ DIR *pdir;
  struct dirent *dp;
  pdir = opendir(argv[1]);
  if (pdir == NULL)
   {printf("error a l'obrir el directori\n"); exit(1); }
  dp = readdir(pdir);
  while (dp != NULL)
  {   printf("%s\n", dp ->d_name);
      dp = readdir(pdir);
  }
 closedir(pdir);
 exit(0);
}

Comentaris:




 

Entrada/Sortida de baix nivell: funcions read, write

#define N 512 // nombre de bytes a llegir (arbitrari)

main( )
{  char buffer[N];
    int n;
    while (( n = read(0, buffer, sizeof(buffer))) > 0 )
         write(1, buffer, n);
    exit(0);
}
 

Prova 1: $ ./micat
El programa anirà repetint tot el que anem escrivint (actúa com un "eco") fins que trenquem amb CTRL + C
Prova 2: Si redireccionem l'entrada estàndar aleshores micat fa el mateix que el comandament cat:
$ ./micat < fitxer mostrarà el contingut del fitxer
Prova 3: Si redireccionem l'entrada i la sortida estàndar micat realitzarà la còpia de fitxers:
$ ./micat < fitxer > fitxer_copia copiarà el fitxer en fitxer_copia


Accés a les variables d'entorn: funció getenv

#include <stdio.h>
main( )
{ int i;
  char *p, *getenv( );
  if (( p = getenv("PROVA")) != NULL)
     for (i = 0; i < atoi(p); i++) printf("Hola\n");
 else printf("la variable PROVA no està definida\n");


Comentaris:
1. La funció atoi realitza la conversió de cadena a enter (array-to-integer s'abrevia atoi).
2. Per provar el programa doneu valor a la variable PROVA:
$ PROVA=1; export PROVA
$ ./veure.exe


PRÀCTICA

1. Completar l'utilitat mils de forma que controli si l'usuari ha escrit el nom del directori. Si no informa aquest paràmetre aleshores mils dóna un missatge d'error i atura l'execució.
2. Modificar el programa de creació de fitxers crea: consultarà la variable d'entorn GRUP i si val 1 aleshores donarà com a permisos del fitxer rwx per el propietari i r per el grup (constant S_IRGRP). Si GRUP no val 1 aleshores només donarà els permisos rwx al propietari.
3. Convertir el programa mils.c en una funció int mils(char *direc) i el programa crea.c en un altre funció int crea(char *fitxer) que aniran en un mateix fitxer utilitats.c . Compilar aquest fitxer i incloure'l en la biblioteca estàtica mibiblio.a. Finlement provar les dues noves funcions en algún programa de prova.