Llamadas al Sistema

15 oct. 2004 - Bibliotecas de C y llamadas al sistema, diapositiva 3 (15/10/04) dit. UPM. Bibliotecas C. □. C es el ensamblador de UNIX. □ simple. □ sin E/S.
310KB Größe 6 Downloads 59 vistas
Bibliotecas de C y llamadas al sistema Juan C. Dueñas Tomás de Miguel Joaquín Seoane A. Gómez Flechoso Alejandro Alonso Muñoz Juan Antonio de la Puente Alfaro Dpto Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid Bibliotecas de C y llamadas al sistema, diapositiva 1 (15/10/04)

dit UPM

Objetivos Conocer las funciones proporcionadas por las bibliotecas de C y sus interfaces al núcleo ◆ Caracteres, cadenas, matemáticas, tiempos, ... ◆ Entrada/Salida ◆ Gestión de memoria y memoria virtual ◆ Procesos ◆ Señales Bibliotecas de C y llamadas al sistema, diapositiva 2 (15/10/04)

dit UPM

Bibliotecas C 

C es el ensamblador de UNIX    



simple sin E/S sin concurrencia sin soporte de tipos

Bibliotecas:  

Reutilización de código hecho y probado Tipos:  

Las que ejecutan en modo usuario Las que acceden al núcleo: ejecutan en modo sistema

Bibliotecas de C y llamadas al sistema, diapositiva 3 (15/10/04)

dit UPM

Bibliotecas simples comprobación de caracteres isalpha(c), isdigit(c), tolower(c), toupper(c), ...

define límites INT_MAX, INT_MIN, LONG_MAX, ULONG_MAX, . . .

funciones matemáticas (datos tipo double) sin(x), cos(x), asin(x), acos(x), exp(x), log(x), ...

manejo de cadenas y octetos strcpy(sd, so), strcmp(s1, s2), strcat(sd, so), memcpy(md, mo, n), memcmp(m1, m2, n), bzero(m, n), ... Bibliotecas de C y llamadas al sistema, diapositiva 4 (15/10/04)

dit UPM

Bibliotecas “estándares”   

E/S ficheros y flujos de datos

printf(fmt, ...), fprintf(f, fmt, ...), scanf(fmt, ...), fscanf(f, fmt, ...), sscanf(s, fmt, ...), sprintf(s, fmt, ...), ...

  

conversión números, memoria, otras utilidades

atoi(s), atof(s), malloc(n), calloc(n, size), free(p), rand(), abs(n),...

  

interfaz con Unix

Bibliotecas de C y llamadas al sistema, diapositiva 5 (15/10/04)

dit UPM

Jerarquía E/S en UNIX 

Dispositivos HW 



E/S básica: núcleo de UNIX 



interfaz: descriptores de ficheros

E/S estándar 



interfaz: manejadores de dispositivos

interfaz: stdio

E/S pantalla 

interfaz: curses, Xlib

Bibliotecas de C y llamadas al sistema, diapositiva 6 (15/10/04)

dit UPM

E/S estándar 

Caracteres • int putchar (int); • int getchar (void);



Cadenas • int puts (char*); • char *gets (char*);

/* No es segura

*/ Bibliotecas de C y llamadas al sistema, diapositiva 7 (15/10/04)

dit UPM

Formatos de E/S 

Formato 

int printf (char*, ...);

char frase[ ]="hola mundo"; int i=5; printf ( “hola\n”);

hola

printf("el valor de i es :%d:\n", i);

el valor de i es :5:

printf("el valor de i es :%10d:\n", i);

el valor de i es :

printf("pi = :%f:\n", 4*atan(1.0));

pi = :3.141593:

printf("pi = :%10.5f:\n", 4*atan(1.0)); printf("frase:%s:\n",frase);

pi = : 3.14159:

frase:hola mundo:

Bibliotecas de C y llamadas al sistema, diapositiva 8 (15/10/04)

5:

dit UPM

Formatos de E/S 

Formato 

int scanf (char*, ...); 

char mes[10]; int dia,anno; scanf("%d %s %d", &dia, mes, &anno);

Bibliotecas de C y llamadas al sistema, diapositiva 9 (15/10/04)

12 enero 2002

dit UPM

Formatos d: decimal o: octal x: hexadecimal u: decimal sin signo c: carácter s: cadena f: coma fija e: mantisa y exponente g: f o e (lo mejor) Bibliotecas de C y llamadas al sistema, diapositiva 10 (15/10/04)

dit UPM

E/S de flujos 

El tipo FILE* representa un flujo de información, tanto entrada como salida



Preabiertos 

stdin



stdout



stderr

Bibliotecas de C y llamadas al sistema, diapositiva 11 (15/10/04)

dit UPM

Operaciones con flujos 

FILE* fopen (const char* filename,             const char* mode); 

r, w, a, r+, w+, a+, ...



int fclose (FILE*);



int fflush (FILE*);

Bibliotecas de C y llamadas al sistema, diapositiva 12 (15/10/04)

dit UPM

E/S estándar de flujos 

Caracteres: 

int fputc(int, FILE*);



int fgetc(FILE*);  • Como macros: putc y getc



Cadenas: 

int fputs(char*, FILE*);



char *fgets(char*, int, FILE*);

Bibliotecas de C y llamadas al sistema, diapositiva 13 (15/10/04)

dit UPM

E/S estándar de flujos 

Formato 

int fprintf(FILE*, char*, ...);



int fscanf(FILE*, char*,...);

Bibliotecas de C y llamadas al sistema, diapositiva 14 (15/10/04)

dit UPM

Descriptores FILE int fileno (FILE*) int _file FILE* fdopen (int desc, char* modo)

Bibliotecas de C y llamadas al sistema, diapositiva 15 (15/10/04)

dit UPM

E/S bajo nivel 

estilo UNIX



identificadores abiertos 

0: stdin



1: stdout



2: stderr

Bibliotecas de C y llamadas al sistema, diapositiva 16 (15/10/04)

dit UPM

Apertura y cierre 

int open(char*name, int flags);



int open(char*name, int flags, int mode);





O_RDONLY, O_WRONLY, O_RDWR,



O_APPEND, O_CREAT, O_TRUNC

int close(int);

Bibliotecas de C y llamadas al sistema, diapositiva 17 (15/10/04)

dit UPM

Operaciones de bajo nivel 

int read(int fd, char* buf, int pedidos);



int write(int fd, char* buf, int pedidos);



Dan número de octetos transferidos   

­1 si fallan 0 si fin de fichero (read) 0) escritos = write (destino, buf, leidos); exit (0); }

Bibliotecas de C y llamadas al sistema, diapositiva 22 (15/10/04)

dit UPM

Directorios 

Funciones para manejo de directorios: 

Bajo nivel int open (char *name, int flags); int getdents(unsigned int fd,               struct dirent *dirp,               unsigned int count);



Alto nivel DIR *opendir(char *dirname); dirent *readdir(DIR *dfd); void closedir(DIR *dfd);

Bibliotecas de C y llamadas al sistema, diapositiva 23 (15/10/04)

dit UPM

Entradas de directorios struct dirent  {   long d_ino;  /* número de nodo­i */   off_t d_off; /* desplazamiento al próximo dirent */   unsigned short d_reclen;/* longitud de este dirent */   char d_name [NAME_MAX+1]; /* nombre del fichero */ }

Bibliotecas de C y llamadas al sistema, diapositiva 24 (15/10/04)

dit UPM

Memoria dinámica 

Gestión explícita de la memoria dinámica (punteros)



Mayor control que en java



Múltiples problemas: 





Pérdidas de memoria, acceso a memoria liberada, violación de límites, violación de alineamiento En C no hay excepciones, por lo que los errores en el manejo de la memoria pueden pasar desapercibidos

Bibliotecas alternativas para detección de errores: efence, dmalloc

Bibliotecas de C y llamadas al sistema, diapositiva 25 (15/10/04)

dit UPM

Memoria dinámica 

Obtención de memoria (en Java es el constructor new ) void *malloc (size_t longitud); void *calloc (size_t nelem, size_t longitud);



Reubicación void *realloc (void *ptr, size_t tamano);



Liberación (en Java es automática) void free (void *ptr); Bibliotecas de C y llamadas al sistema, diapositiva 26 (15/10/04)

dit UPM

Gestión de memoria #include void *malloc (size_t); void free (void*);

nodo *p; ... p = malloc(sizeof(nodo)); ... free(p); Bibliotecas de C y llamadas al sistema, diapositiva 27 (15/10/04)

dit UPM

Gestión de memoria #include nodo *p, *q; ... p = calloc(10, sizeof (nodo)); ... q = realloc(p, sizeof (nodo) * 18); ... free(q); Bibliotecas de C y llamadas al sistema, diapositiva 28 (15/10/04)

dit UPM

Montaje con efence 



La mayoría de lo que usemos se enlaza dinámicamente (con libc) automáticamente. Se pueden sustituir rutinas dinámicamente con: LD_PRELOAD=libefence.so



Se pueden sustituir estáticamente al montar: gcc ­lefence programa.c .....

Bibliotecas de C y llamadas al sistema, diapositiva 29 (15/10/04)

dit UPM

Modelo de procesos en UNIX ➢

Unidad de concurrencia y de protección



Cada proceso tiene: ➢

Texto y constantes.



Datos con valor inicial.



Otros datos (pila, montículo).



Contexto del núcleo.

Bibliotecas de C y llamadas al sistema, diapositiva 30 (15/10/04)

dit UPM

Contexto del núcleo ➢ ➢ ➢ ➢ ➢ ➢

➢ ➢ ➢ ➢ ➢

Identidad suya y de su padre: getpid, getppid. Identidad de grupo de procesos: getpgrp, setpgrp. Sesión: setsid. Terminal de control. Usuario y grupo real: getuid, getgid, setuid, setgid. Usuario y grupo efectivo: geteuid, getegid, seteuid, setegid. Máscara de creación de ficheros: umask Directorio de trabajo: chdir. Directorio raíz: chroot. Descriptores de e/s abiertos: open, pipe, socket, .... Manejo de señales: signal, sigaction.

Bibliotecas de C y llamadas al sistema, diapositiva 31 (15/10/04)

dit UPM

Procesos ➢ ➢

Creación de procesos: fork Se duplican código y datos: ➢ ➢



El código y constantes virtualmente. Normalmente los datos también (copy on write)

Se heredan: ➢ ➢ ➢ ➢ ➢ ➢

identidades para protección, grupos de procesos ficheros abiertos directorios de trabajo y raíz manejo de señales ....

Bibliotecas de C y llamadas al sistema, diapositiva 32 (15/10/04)

dit UPM

Procesos (Cont.) ➢

Se distinguen por el resultado: ➢ ➢



Se usa para que: ➢ ➢



0 para el hijo. Pid del hijo para el padre. Distintas copias hagan cosas distintas. Ejecutar otro programa.

El padre puede esperar: ➢ ➢

Que termine el hijo. Saber cómo le fue.

Bibliotecas de C y llamadas al sistema, diapositiva 33 (15/10/04)

dit UPM

Ejemplos ➢



Ejemplos: fork.c: ➢

Se crean varios procesos.



Cada uno escribe 20 caracteres en un fichero o dispositivo de salida.



Ejemplo llamada: fork f1 f2 /dev/tty

Ejemplo: forkwait.c ➢

Ahora el padre espera a que los hijos terminen.

Bibliotecas de C y llamadas al sistema, diapositiva 34 (15/10/04)

dit UPM

fork.c #include #include int main(int argc, char* argv[]) { int i, j, pid, salida; char c; for (i=1; i