You are on page 1of 62

Captulo 1

Introduccin
1.1 Qu es un sistema operativo? 1.2 Evolucin de los sistemas operativos 1.3 Tipos de sistemas operativos 1.4 Recordando aspectos hardware 1.5 Conceptos de sistemas operativos 1.6 Llamadas al sistema 1.7 Estructuras de los sistemas operativos
D.I.A. Sistemas Operativos I @ (ITIS) 1

Introduccin
Sistema bancario
Compiladores

Reserva de billetes Editores

Navegador web Intrprete de comandos

Aplicaciones
Programas del Sistema

Sistema Operativo Lenguaje mquina


Ruta de datos ALU Registros CPU Acceso a perifricos Hardware

Microarquitectura Dispositivos Fsicos

D.I.A.

Sistemas Operativos I @ (ITIS) 2

Qu es un sistema operativo? (1)


1. Es una mquina extendida
Esconde los detalles del hardware Presenta una mquina virtual Presenta abstracciones: fichero, proceso, I/O, memoria

Por ejemplo: lectura de un fichero (Minix)

D.I.A.

Sistemas Operativos I @ (ITIS) 3

Qu es un sistema operativo? (2)

D.I.A.

Sistemas Operativos I @ (ITIS) 4

Qu es un sistema operativo? (3)


2. Es un gestor de recursos
Memoria, procesador, discos, impresoras, Dispositivos no compartidos Proteccin de memoria Quin utiliza qu recurso? Multiplexar recursos en tiempo y espacio

D.I.A.

Sistemas Operativos I @ (ITIS) 5

Evolucin sistemas operativos (1)


Dispositivo de cinta Lector de tarjetas

Cinta de entrada

Cinta del sistema

Cinta de salida Impresora

1401

7094

1401

Primeros sistemas batch


D.I.A.

(2 generacin)

Sistemas Operativos I @ (ITIS) 6

Evolucin sistemas operativos (2)


Trabajo 3 Trabajo 2 Trabajo 1 Sistema Operativo Particiones de Memoria

3 generacin:
- Multiprogramacin - Simultaneous Peripheral Operation On Line - Tiempo compartido: CTTS, MULTICS, UNIX
D.I.A. Sistemas Operativos I @ (ITIS) 7

Evolucin sistemas operativos (3)


4 generacin:
- Alta escala de integracin: microcomputadores - Control Program for Microcomputer - Disk Operating System - MicroSoft Disk Operating System - Graphical User Interface - Windows 3.x, 95, 98, NT, 2000, Me, XP, Vista - Linux (Red Hat, Debian, Caldera, Fedora...) - Sistemas operativos de Red - Sistemas operativos distribuidos
D.I.A. Sistemas Operativos I @ (ITIS) 8

Tipos de sistemas operativos (1)


Sistemas operativos para mainframe
Batch, transacciones, tiempo compartido OS/390

Sistemas operativos para servidores


Servicios de impresin, ficheros, web Unix, Windows 2000, Linux

Sistemas operativos multiprocesador


Unix, Encore

Sistemas operativos para ordenadores personales Sistemas operativos de tiempo real


Hard real-time system, soft real-time system

Sistemas operativos empotrados (embarcados)


PalmOS, Windows CE

Sistemas operativos para tarjeta inteligentes


D.I.A. Sistemas Operativos I @ (ITIS) 9

Conceptos de sistemas operativos (1)


Proceso Un programa en ejecucin. Espacio de direccionamiento
Programa ejecutable (texto) Datos Pila

Contexto (entrada a la tabla de procesos)



D.I.A.

Registros de la CPU PC, SP, PSW. Tabla de ficheros abiertos Mapa de memoria .......
Sistemas Operativos I @ (ITIS) 10

Conceptos de sistemas operativos (2)


Proceso
operaciones asociadas a un proceso (p.ejem.: shell) Crear un proceso (relacin padre-hijo) Terminar un proceso Comunicacin y sincronizacin entre procesos Pedir/ liberar memoria Esperar a que termine uno de los hijos Cargar una imagen de texto Establecer/tratar/enviar seales (p.ejem.: temporizadores) Un proceso tiene varios identificadores uid, identificador del propietario del proceso pid, identificador del propio proceso gid, identificador del grupo al que pertenece el proceso
D.I.A. Sistemas Operativos I @ (ITIS) 11

Conceptos de sistemas operativos (3)


Interbloqueo entre procesos

Los interbloqueos se producen por la competencia entre procesos por conseguir los recursos del sistema
D.I.A. Sistemas Operativos I @ (ITIS) 12

Conceptos de sistemas operativos (4)


Gestin de memoria
Asignacin/liberacin de memoria Mecanismos de proteccin Gestin de huecos y compactacin Gestin de la memoria virtual (paginacin, segmentacin)

Gestin de dispositivos de E/S


Teclados, monitores, impresoras, discos, ... Software de E/S independiente del dispositivo (proteccin, buffering, esquema de nombrado, tamao de bloque, ...) Software de entrada salida dependiente del dispositivo (drivers)
D.I.A. Sistemas Operativos I @ (ITIS) 13

Conceptos de sistemas operativos (5)


Sistema de ficheros
Directorio raiz
EUI SIA Estudiantes DIA

ATC

Cursos Pedro Ana

Libros

Apuntes Tribunales

TFC1
Mara SD SO-I TFC2

Ficheros
D.I.A. Sistemas Operativos I @ (ITIS) 14

Conceptos de sistemas operativos (6)


Operaciones sobre ficheros Crear, abrir, cerrar, leer, escribir, posicionar, borrar, ... Un directorio tambin es un fichero Un fichero tiene un nombre: absoluto, relativo File descriptor Sistemas de ficheros montado Tipos de ficheros
Ficheros ordinarios Ficheros especiales Pipes

D.I.A.

Sistemas Operativos I @ (ITIS) 15

Conceptos de sistemas operativos (7)


Shell
No es parte del sistema operativo sh, csh, ksh, bash Crea procesos para ejecutar comandos Gestiona las redirecciones (entrada/salida) y pipes
cat file1 file2 file3 | sort > /dev/lp

Ejecucin en background
cat file1 file2 file3 | sort > /dev/lp &

Seguridad
Bits rwx de los ficheros (propietario, grupo, otros)
rwx rwx rwx

D.I.A.

Sistemas Operativos I @ (ITIS) 16

Llamadas al sistema (1)

Veremos llamadas en POSIX Son invocaciones de rutinas de biblioteca


D.I.A. Sistemas Operativos I @ (ITIS) 17

Llamadas al sistema (2)


Direccin 0xFFFFFFFF Retorno al llamador Trap al kernel 5 Pone cdigo de read en el registro 10 4 6 3 2 1 Incrementa PP Llamada a read Push fd Push &buffer Push nbytes 7 8 11

Espacio de Usuario

?
Manejador de llamada al sistema

Espacio del Sistema (Sistema Operativo)


0

Dispatch

Ejemplo:
D.I.A.

count = read (fd, buffer, nbytes)


Sistemas Operativos I @ (ITIS) 18

Llamadas al sistema (3)


PROCESOS. SEALES. FICHEROS. . Veremos llamadas en POSIX . No todas. man
man 1 write envia un mensaje a otro usuario man 2 write escribe a un descriptor de fichero

Portable Operating System Interface, viniendo la X de UNIX

bytesLeidos = read (fichero, buffer, nBytes); Si falla bytesLeidos = -1. Verificar siempre los errores. En la variable errno el cdigo del error.
D.I.A. Sistemas Operativos I @ (ITIS) 19

Llamadas al sistema (4)


GESTIN DE PROCESOS. Cada proceso tiene asociados varios identificadores pid_t pid_t uid_t uid_t gid_t gid_t getpid (void); /* pid */ getppid (void); /* ppid */ getuid (void); /* real user ID */ geteuid (void); /* effective user ID */ getgid (void); /* real group ID */ getegid (void); /* effective group ID */

D.I.A.

Sistemas Operativos I @ (ITIS) 20

Llamadas al sistema (5)


GESTIN DE PROCESOS. Crea un proceso.
#include <unistd.h>

FORK

pid_t fork (void) El hijo es idntico al padre, salvo en: pid, ppid recursos asignados Los bloqueos en ficheros del padre no los hereda el hijo. Seales pendientes del padre no las hereda el hijo.
D.I.A. Sistemas Operativos I @ (ITIS) 21

Llamadas al sistema (6)


GESTIN DE PROCESOS.

FORK

main () { int pid; pid = fork (); if (pid == -1) fprintf (stderr, "Error %d %s \n", errno, strerror(errno)); else if (pid == 0) { printf ("Soy el proceso hijo\n"); printf (" pid = %d, ppid = %d, uid = %d, euid = %d, gid = %d egid = %d\n", getpid(), getppid(), getuid(), geteuid(), getgid(), getegid()); } else { sleep (1); printf ("Soy el proceso padre\n"); printf (" pid = %d, ppid = %d, uid = %d, euid = %d, gid = %d egid = %d\n", getpid(), getppid(), getuid(), geteuid(), getgid(), getegid()); } }
/* Soy el proceso hijo */ /* pid = 2798, ppid = 2797, uid = 1000, euid = 1000, gid = 1000 egid = 1000 */ /* Soy el proceso padre */ /* pid = 2797, ppid = 2178, uid = 1000, euid = 1000, gid = 1000 egid = 1000 */ D.I.A. Sistemas Operativos I @ (ITIS) 22

Llamadas al sistema (7)


GESTIN DE PROCESOS.

WAIT

Suspende la ejecucin del proceso actual hasta que termine alguno de sus hijos (o hasta que reciba alguna seal).
#include <sys/wait.h>

pid_t wait (int *status); r = wait (&status); - Si no existen hijos, devuelve 1. - Si no hay hijos zombies se duerme. - Si hay algn hijo zombie se liberan todos sus recursos.
D.I.A. Sistemas Operativos I @ (ITIS) 23

Llamadas al sistema (8)


GESTIN DE PROCESOS.

WAIT

Terminacin normal
status 00

valor de exit (comunicar informacin al padre)

Terminacin anormal
#0 status nmero de seal que mat al hijo = 1 volcado de memoria

D.I.A.

Sistemas Operativos I @ (ITIS) 24

Llamadas al sistema (9)


GESTIN DE PROCESOS.

WAITPID

Suspende la ejecucin del proceso actual hasta que termine el hijo especificado en pid.
#include <sys/types.h> #include <sys/wait.h>

pid_t waitpid (pid_t pid, int *status, int options)


pid == -1 pid > 0 pid == 0 pid < -1 options
D.I.A.

cualquier hijo (como en wait) cualquier hijo con id = pid cualquier hijo con su mismo process group ID cualquier hijo con process group ID == |pid| WNOHANG, WUNTRACED
Sistemas Operativos I @ (ITIS) 25

Llamadas al sistema (10)


GESTIN DE PROCESOS. r = waitpid (8, &status, 0); Devuelve en r el pid del hijo que termin y almacena su estado (al salir) en status. Devuelve 1 si: - el padre no tiene hijos. - el pid no existe o indica un proceso que no es hijo suyo.

WAITPID

D.I.A.

Sistemas Operativos I @ (ITIS) 26

Llamadas al sistema (11)


GESTIN DE PROCESOS.

EXIT

Termina el proceso que invoc la llamada.


#include <stdlib.h>

void exit (int status);


- Despus de exit, pasa al estado de zombie. - Pone su estado de terminacin en status. - Si el padre ha muerto, su ppid se pone a 1 (init). - No devuelve nada ni regresa.

D.I.A.

Sistemas Operativos I @ (ITIS) 27

Llamadas al sistema (12)


GESTIN DE PROCESOS.

EXIT

main () { int r, status; if (fork() != 0) { printf ("El proceso padre va a esperar al hijo\n"); r = wait (&status); printf ("Mi hijo tenia el pid: %d", r); printf (" y su valor de salida es: %x\n", status); } else { printf ("Proceso hijo va a salir\n"); exit (255); } } /* Proceso hijo va a salir */ /* El proceso padre va a esperar al hijo */ /* Mi hijo tenia el pid: 3174 y su valor de salida es: ff00 */
D.I.A. Sistemas Operativos I @ (ITIS) 28

Llamadas al sistema (13)


GESTIN DE PROCESOS.

EXEC

Cambia la imagen de memoria (texto, datos, pila) de un proceso y arranca la ejecucin.


#include <unistd.h>

int execve (const char *filename, const char *argv[], const char *envp[]); filename el nombre de un fichero que contiene el programa a ejecutar. argv argumentos al programa. envp variables de entorno (0 si hereda las del programa llamante).
D.I.A. Sistemas Operativos I @ (ITIS) 29

Llamadas al sistema (14)


GESTIN DE PROCESOS.

EXEC

- Si xito, no regresa. - Los descriptores abiertos se mantienen abiertos. - Las seales se resetean al valor por omisin. - Se pueden actualizar los euid y egid en funcin de los bits set-uid y set-gid del fichero. Ejemplo: cp f1 f2 La shell crea un proceso y este proceso ejecuta: r = execve (/bin/cp, &argv, &envp);
D.I.A. Sistemas Operativos I @ (ITIS) 30

Llamadas al sistema (15)


GESTIN DE PROCESOS.
puntero a los argumentos argv argumentos cp f1 f2

EXEC

NULL
puntero al entorno envp entorno HOME = /home/jorge\0 PATH = :bin:/usr/bin\0 SHELL = /bin/sh\0 USER = jorge\0 NULL
D.I.A. Sistemas Operativos I @ (ITIS) 31

Llamadas al sistema (16)


GESTIN DE PROCESOS.

EXEC

Ejemplo de una shell simplificada: while (TRUE) leer_comando (comando, parametros); if (fork() != 0) { r = wait (&status); } else{ execve (comando, parametros, 0); exit (127); /* ? */ } } Cmo sera el background? Qu pasara con el hijo?
D.I.A. Sistemas Operativos I @ (ITIS) 32

Llamadas al sistema (17)


GESTIN DE SEALES. Seal interrupcin software ha ocurrido un evento asncrono (Ctrl-C) Cada seal tiene un nombre (<signal.h>) Qu condiciones pueden disparar una seal? Teclas del teclado: DELETE SIGINT Excepciones hardware: direccin memoria invalida SIGSEGV Llamada al sistema kill. Condiciones software: SIGALRM expira una alarma
D.I.A. Sistemas Operativos I @ (ITIS) 33

Llamadas al sistema (18)


GESTIN DE SEALES. Qu puede hacer un proceso cuando se recibe una seal? Ignorar la seal (excepto para SIGKILL y SIGSTOP). Capturar la seal y tratarla escribir la rutina de tratamiento de la seal. Dejar la accin por omisin (matar al proceso que la recibe).

D.I.A.

Sistemas Operativos I @ (ITIS) 34

Llamadas al sistema (19)


GESTIN DE SEALES.
SIGABRT SIGALRM SIGBUS SIGFPE SIGILL SIGINT SIGKILL SIGPIPE llamando a la funcin abort. Expira el tiempo de una alarma fallo hardware definido por la implementacin excepcin aritmtica (/0, oveflow, ...) instruccin ilegal Control_C ni atrapar ni ignorar escribir en un pipe sin lectores terminate/w core terminate terminate/w core terminate/w core terminate/w core terminate terminate terminate

SIGQUIT
SIGSEGV SIGTRAP SIGUSR1

control-backslash
referencia invlida a memoria fallo hardware definido por la implementacin a definir por el usuario

terminate/w core
terminate/w core terminate/w core terminate

SIGUSR2
D.I.A.

a definir por el usuario


Sistemas Operativos I @ (ITIS)

terminate

35

Llamadas al sistema (20)


GESTIN DE SEALES.

SIGACTION

Permite examinar o modificar (o ambas) la accin asociada con una determinada seal.
#include <signal.h>

int sigaction (int signum, const struct sigaction *act, struct sigaction *oldact); siendo: signum: nmero de seal (salvo SIGKILL y SIGSTOP) act: si no es NULL modificando la accin. oldact: si no es NULL accin previa
D.I.A. Sistemas Operativos I @ (ITIS) 36

Llamadas al sistema (21)


GESTIN DE SEALES.

SIGACTION

struct sigaction { void (*sa_handler) (int); /*direccin del manejador de la seal o SIG_IGN o SIG_DFL */ sigset_t sa_mask; /* seales a bloquear */ int sa_flags; /* modifica el comportamiento del proceso */ }; *sa_handler: ponemos la rutina de tratamiento. sa_flags: SA_RESETHAND /* no recarga la seal */

D.I.A.

Sistemas Operativos I @ (ITIS) 37

Llamadas al sistema (22)


GESTIN DE SEALES.

SIGACTION

void accion_alarma () { printf(Pasaron 2 segundos\n); } main () { struct sigaction tratamiento_alarma; tratamiento_alarma.sa_handler = accion_alarma; sigaction (SIGALRM, &tratamiento_alarma, 0); while (1) {alarm (2);pause ();} }
- El proceso queda bloqueado de manera indefinida en la llamada al sistema pause. - Se escribe una vez el mensaje Pasaron 2 segundos. - Se escribe un nmero indefinido de veces el mensaje Pasaron 2 segundos. - Ninguna de las respuestas anteriores.
D.I.A. Sistemas Operativos I @ (ITIS) 38

Llamadas al sistema (23)


GESTIN DE SEALES.

KILL

Enva una seal a un proceso o grupo de procesos.


#include <sys/types.h> #include <signal.h>

int kill (pid_t pid, int sig);


El uid o el euid del emisor debe concidir con el uid o el euid del receptor (salvo si el emisor es el superusuario). pid > 0 al proceso identificado por pid. pid = 0 a todos los procesos en el grupo de procesos del proceso actual. pid = -1 a cada proceso excepto al 1 (init). pid < -1 a cada proceso cuyo ID de grupo sea igual a |pid|.
D.I.A. Sistemas Operativos I @ (ITIS) 39

Llamadas al sistema (24)


GESTIN DE SEALES.

ALARM

Enva la seal SIGALRM al proceso que la invoca una vez transcurridos (al menos) los segundos que figuran como parmetro.
#include <unistd.h>

unsigned int alarm (unsigned int sec);


/* devuelve el nmero de segundos que faltan para que expire la alarma anterior; 0 si no hay ninguna */ Las sucesivas llamadas a alarm no se apilan: slo tiene efecto la ltima. Si el nmero se segundos es 0 se cancela la alarma previa.

D.I.A.

Sistemas Operativos I @ (ITIS) 40

Llamadas al sistema (25)


GESTIN DE SEALES.

PAUSE

Suspende al proceso que la invoca hasta que recibe una seal.


#include <unistd.h>

int pause (void); Generalmente ligada a una alarma. Siempre devuelve -1.

D.I.A.

Sistemas Operativos I @ (ITIS) 41

Llamadas al sistema (26)


GESTIN DE SEALES.
void vacio (){} main () { struct sigaction tratamiento; int pid; pid = fork(); if (pid != 0) { alarm (2); pause (); kill (pid, SIGTERM); } else {tratamiento.sa_handler = vacio; sigaction (SIGALRM, &tratamiento, 0); while (1) printf (A); } }

A El nmero de A que se pueda imprimir en 2 segundos. Un nmero infinito de A Ninguna de las opciones anteriores.
D.I.A. Sistemas Operativos I @ (ITIS) 42

Llamadas al sistema (27)


GESTIN DE FICHEROS. OPEN Abre o crea un fichero.
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>

int open (const char *camino, int flags); int open (const char *camino, int flags, mode_t mode); Open devuelve el menor descriptor disponible.!! camino: nombre del fichero a abrir o a crear. mode: si el fichero no exista y se determina su creacin, este campo especifica el modo de proteccin del nuevo fichero.
D.I.A. Sistemas Operativos I @ (ITIS) 43

Llamadas al sistema (28)


GESTIN DE FICHEROS. OPEN Valores para flags:
O_RDONLY /* slo lectura */ O_WRONLY /* slo escritura */ O_RDWR /* lectura y escritura */ /* Son mutuamente excluyentes */ O_APPEND: /* se sita al final del fichero */ O_CREAT: /* crea el fichero si no existe */ O_EXCL: /* si tambin se utiliz O_CREAT y el fichero ya existe, open falla */ O_TRUNC: /* si existe el fichero y se abri para escritura o lectura/escritura, trunca su longitud a 0 */ O_SYNC: /* se fuerza la escritura fsica al dispositivo */ y otros valores.
D.I.A. Sistemas Operativos I @ (ITIS) 44

Llamadas al sistema (29)


GESTIN DE FICHEROS. CLOSE

Cierra el fichero indicado.


#include <unistd.h>

int close (int fd); Devuelve 0 si OK y 1 si error. Libera los cerrojos que pudiera tener el proceso sobre el fichero.

D.I.A.

Sistemas Operativos I @ (ITIS) 45

Llamadas al sistema (30)


GESTIN DE FICHEROS. CREAT

Crea un nuevo fichero.


#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>

int creat (const char *camino, mode_t modo); El fichero se queda abierto slo para escritura. macros para especificar modo: S_IRWXU, S_IRUSR, S_IWUSR, S_IWGRP, S_IXOTH, ..
D.I.A. Sistemas Operativos I @ (ITIS) 46

Llamadas al sistema (31)


GESTIN DE FICHEROS. READ

Intenta leer hasta nbytes de un fichero abierto previamente y dejarlos en buf.


#include <unistd.h>

ssize_t read (int fd, void *buf, size_t nbytes);


Devuelve el nmero de bytes ledos. 0 si estaba al final del fichero. 1 si error.

D.I.A.

Sistemas Operativos I @ (ITIS) 47

Llamadas al sistema (32)


GESTIN DE FICHEROS. WRITE

Escribe datos a un fichero abierto previamente.


#include <unistd.h>

ssize_t write (int fd, const void *buf, size_t num); Devuelve el nmero de bytes escritos que ser igual a num, 1 en caso contrario.

D.I.A.

Sistemas Operativos I @ (ITIS) 48

Llamadas al sistema (33)


GESTIN DE FICHEROS. LSEEK Modifica la posicin del puntero asociado al fichero indicado.
#include <sys/types.h> #include <unistd.h>

off_t lseek (int filedes, off_t offset, int whence); Devuelve el nuevo valor del puntero 1 si error. whence: SEEK_SET puntero = offset desde el principio del fichero. SEEK_CUR puntero = puntero actual + offset (puede ser <0) SEEK_END puntero = tamao del fichero + offset (puede <0)
D.I.A. Sistemas Operativos I @ (ITIS) 49

Llamadas al sistema (34)


GESTIN DE FICHEROS. DUP Duplica un descriptor de fichero existente.
#include <unistd.h>

int dup (int oldfd);

Devuelve el descriptor menor disponible.


Los dos descriptores comparten candados, posicin puntero y flags. Para qu vale dup? redirecciones e/s. % ls > f1
D.I.A. Sistemas Operativos I @ (ITIS) 50

Llamadas al sistema (35)


GESTIN DE FICHEROS. DUP
Descriptores de ficheros 0 1 2 3 Descriptores de ficheros 0 1 2 3

fd = dup (1)

open (f1, ...)


Descriptores de ficheros 0 FREE 2 3

close (1)
0 1 2 3

f1 Write (STDOUT, ...)

D.I.A.

Sistemas Operativos I @ (ITIS) 51

Llamadas al sistema (36)


GESTIN DE FICHEROS. DUP
Descriptores de ficheros 0 FREE 2 3

close (f1)

Descriptores de ficheros 0 1 2 3

n = dup (fd)

close (fd)
0 1 2 3

D.I.A.

Sistemas Operativos I @ (ITIS) 52

Llamadas al sistema (37)


GESTIN DE FICHEROS. PIPE Los pipes se utilizan para comunicar dos procesos.
#include <unistd.h>

int pipe (int descf[2]); /* 0 si OK; -1 si error */ Limitaciones: Semi-duplex: flujo de datos en slo una direccin. Slo entre procesos con el mismo ancestro. descf[0]: abierto para lectura descf[1]: abierto para escritura
D.I.A. Sistemas Operativos I @ (ITIS) 53

Llamadas al sistema (38)


GESTIN DE FICHEROS. PIPE
main () { int n, fd[2]; pid_t pid; char line[80]; if (pipe(fd) < 0) {fprintf (stderr, "Error %d %s\n, errno, strerror(errno)); exit (2);} if ((pid = fork()) < 0) {fprintf (stderr"Error %d %s\n, errno, strerror(errno)); exit (3);} if (pid != 0) { /* padre */ close (fd[0]); write (fd[1], "hola mundo\n", 11); } else { /* hijo */ close (fd[1]); n = read (fd[0], line, 11); write (1, line, n); } exit (0); }
D.I.A. Sistemas Operativos I @ (ITIS) 54

Llamadas al sistema (39)


GESTIN DE FICHEROS. STAT,

FSTAT, LSTAT

Devuelven informacin sobre el fichero especificado.


#include <sys/stat.h> #include <unistd.h>

int stat (const char *filename, struct stat *buf); int fstat (int filedes, struct stat *buf); int lstat (const char *filename, struct stat *buf); Devuelven 0 si OK; -1 si error. lstat cuando el fichero nombrado es un enlace simblico informacin sobre el enlace (no sobre el fichero).
D.I.A. Sistemas Operativos I @ (ITIS) 55

Llamadas al sistema (40)


GESTIN DE FICHEROS. STAT,

FSTAT, LSTAT

struct stat { mode_t st_mode; /* proteccin */ ino_t st_ino; /*nmero de i-node*/ dev_t st_dev; /*dispositivo en el que reside el fichero*/ dev_t st_rdev; /*nmero de dispositivo para ficheros especiales*/ nlink_t st_nlink; /*nmero de enlaces*/ uid_t st_uid; /* user ID del propietario*/ gid_t st_gid; /*group ID del propietario*/ off_t st_size; /*tamao en bytes ficheros regulares-*/ time_t st_atime; /*fecha del ltimo acceso*/ time_t st_mtime; /*fecha de la ltima modificacin*/ time_t st_ctime; /*fecha del ltimo cambio al i-node*/ long st_blksize; /* tamao del bloque de I/O*/ long st_blocks; /*nmero de bloques (512 bytes) asignados*/ }
D.I.A. Sistemas Operativos I @ (ITIS) 56

Llamadas al sistema (41)


GESTIN DE FICHEROS. LINK
Crea un enlace (un nuevo nombre) a un fichero existente.
#include <unistd.h>

int link (const char *oldpath, const char*newpath); - Crea una nueva entrada newpath (en el directorio) que referencia al fichero existente oldpath. - Si newpath ya existe -1 (error). - Solamente el superusuario puede crear un enlace nuevo a un directorio (por qu?). - Incrementa en 1 el campo st_nlink del i-node
D.I.A. Sistemas Operativos I @ (ITIS) 57

Llamadas al sistema (42)


GESTIN DE FICHEROS. UNLINK
Elimina una entrada a un directorio
#include <unistd.h>

int unlink (const char *pathname); Decrementa en 1 el campo st_nlink. Si se hace 0 elimina el fichero (los bloques que ocupa).

Devuelve 0 si OK; -1 si error.

D.I.A.

Sistemas Operativos I @ (ITIS) 58

Prctica de minishell (1)


Objetivos: Familiarizacin con el uso de llamadas al sistema POSIX ms usuales Comprensin del funcionamiento bsico de una shell Manejo de un entorno Unix para trabajar Conocimiento de un depurador grfico de lenguaje C
D.I.A. Sistemas Operativos I @ (ITIS) 59

Prctica de minishell (2)


Construccin de una minishell que: 1. Muestre el prompt y lea de la lnea de comandos ordenes que puedan contener la redireccin de entrada y pipes:
ORDEN = CMD [< fich_ent][ | CMD]*
CMD = fich_ejec [argumentos]*

Ejemplos de ordenes vlidas:


msh$ ls l -a msh$ grep Lopez < apellidos | sort msh$ cat notas | grep 10 | sort

2. 3. 4.
D.I.A.

Analice sintcticamente lo ledo y si no hay errores: Ejecute la orden, teniendo en cuenta que se debe admitir un mximo de 3 pipes encadenados. Si las llamadas fallan indique el error con fprintf
Sistemas Operativos I @ (ITIS) 60

Prctica de minishell (3)


La lectura del comando y anlisis sintctico se realizan usando las siguientes funciones:
int leeYanaliza() char* obtenCmd( int i) char** obtenAgs ( int cmdi) char* obtenArg( int cmdi, int argj) char* obtenFichEnt() char* obtenFichSal() int hayBackground() int esFinFichero()

La redireccin y la ejecucin del comando se realiza con las llamadas:


open, close, dup, fork, exec y sus variantes y waitpid Ms informacin: man s2 llamada

El tratamiento de errores de las llamadas con:


#include <errno.h> #include <string.h> fprintf(stderr, error %d %s \n, errno, strerror(errno));

D.I.A.

Sistemas Operativos I @ (ITIS) 61

Prctica de minishell (4)


Enunciado de la prctica en la Web de la asignatura Ficheros necesarios en:
cajal /eui/practs/so1s/practica1 Web de la asignatura

Lugar de desarrollo
cajal en cualquier ordenador con knoppix 2.6

Depuracin y pruebas
Depurador grfico ddd Pruebas que considere el alumno

Fecha lmite de entrega


16 de mayo a las 21 horas

Forma de entrega
La practica msh.c debe residir el directorio $HOME/so1s del alumno con menor nmero de matrcula ejecutar comando so1s en cajal

D.I.A.

Sistemas Operativos I @ (ITIS) 62

You might also like