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 nodoi */ 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