Sistemas Operativos. Tema 2. Interfaces SOP2.39 Relación entre las distintas tablas en el sistema TABLA DE DESCRIPTORES DE FICHEROS DE USUARIO TABLA DE PROCESOS (proc. A) (proc. B) TABLA DE NODOS I Sistemas Operativos. Tema 2. Interfaces SOP2.40 Apertura de ficheros lee de un fichero n = read ( fd, buffer, nbytes ) cantidad leida buffer destino descriptor de fichero TABLA DE DESCRIPTORES DE FICHEROS DE USUARIO TABLA DE PROCESOS (proc. A) 0 1 ... 2 3 count 4 1 Read 5 ... ... count 1 Write ... count 1 Read (proc. B) ... 0 count 1 1 Rd-Wrt 2 3 ... 4 count 5 1 Read ... Proceso A fd1 = open ("/etc/passwd",RD); fd2 = open ("local",WR); fd3 = open ("/etc/passwd",RDWR); cantidad a leer TABLA DE NODOS I count 3 /etc/passwd count 1 local count 1 private Proceso B fd1 = open ("/etc/passwd",RD); fd2 = open ("private",RD); Sistemas Operativos. Tema 2. Interfaces SOP2.41 Cierre de ficheros cierra un fichero s = close ( fd ) descriptor de fichero TABLA DE DESCRIPTORES DE FICHEROS DE USUARIO TABLA DE PROCESOS (proc. A) 0 1 ... 2 3 count 4 1 Read 5 ... ... count 1 Write ... count 0 Read (proc. B) ... 0 count 1 1 Rd-Wrt 2 3 NULL ... 4 NULL count 5 0 Read ... Proceso A TABLA DE NODOS I count 2 /etc/passwd count 1 local count 0 private Proceso B close (fd1); close (fd2); Sistemas Operativos. Tema 2. Interfaces SOP2.42 Operación dup duplica el descriptor de un fichero fd = dup ( fd1 ) nuevo descriptor del mismo fichero descriptor original del fichero TABLA DE DESCRIPTORES DE FICHEROS DE USUARIO TABLA DE PROCESOS (proc. A) 0 1 ... 2 3 count 4 2 Read 5 6 ... ... count 1 Write ... count 0 Read (proc. B) ... 0 count 1 1 Rd-Wrt 2 3 ... 4 count 5 0 Read ... Proceso A fd1 = open ("/etc/passwd",O_RDONLY); fd2 = open ("local",O_WRONLY); fd3 = open ("/etc/passwd",O_RDWRT); fd4 = dup (3); Ejemplo de Utilización de dup TABLA DE NODOS I count 2 /etc/passwd count 1 local count 0 private Proceso B Sistemas Operativos. Tema 2. Interfaces Redireccionar_salida (s) char *s; { int fd; fd = creat (s,0666); close (STD_OUTPUT); dup (fd); close (fd); } Redireccionar_entrada (e) char *e; { int fd; fd = open (e, RD_ONLY); close (STD_INPUT); dup (fd); close (fd); } SOP2.43 Sistemas Operativos. Tema 2. Interfaces SOP2.44 Operación pipe crea un pipe s = pipe ( &fd[0] ) fd[0] descriptor para lectura fd[1] descriptor para escritura TABLA DE DESCRIPTORES DE FICHEROS DE USUARIO TABLA DE PROCESOS (proc. A) 0 1 ... 2 fd[0] 3 count fd[1] 4 1 Read 5 ... ... count 1 Write ... count 1 Read ... count 1 Rd-Wrt TABLA DE NODOS I count 2 pipe count 3 /dev/tty ... count 1 Proceso A Read Proceso B int fd[2] pipe(fd); Creamos dos enlaces con el fichero fd, uno de lectura y otro de escritura Sistemas Operativos. Tema 2. Interfaces SOP2.45 fd[0] fd[1] lectura escritura Ejemplo: Esqueleto de programa para disponer dos procesos en cadena. # define STD_INPUT # define STD_OUTPUT 0 1 cadena(proceso1, proceso2) char *proceso1, *proceso2; { int fd[2]; // descriptor de fichero entrada estandar // descriptor de fichero salida estandar // punteros a nombres de programa pipe(&fd[0]); if (fork() != 0) { close(fd[0]); close(STD_OUTPUT); // el proceso 1 no ha de leer del tubo // preparación de la nueva salida estandar dup(fd[1]); // salida estandar vinculada a fd[1] close(fd[1]); // ya no se necesita más el tubo execl(proceso1,proceso1,0); } else { close(fd[1]); close(STD_INPUT); // el proceso 2 no escribe en el tubo // preparación de la nueva entrada estandar dup(fd[0]); // entrada estandar vinculada a fd[0] close(fd[0]); // ya no se necesita más el tubo execl(proceso2, proceso2,0) } } Operación fork Sistemas Operativos. Tema 2. Interfaces SOP2.46 pid = fork () pid del proceso hijo o 0 crea un proceso con copia de la imagen en memoria del padre TABLA DE DESCRIPTORES DE FICHEROS DE USUARIO TABLA DE PROCESOS (proc. A) 0 1 ... 2 3 count 4 2 Read 5 ... ... count 2 Write ... count 2 Read (proc. B) ... 0 count 1 2 Rd-Wrt 2 3 ... 4 count 5 2 Read ... if (fork () != 0) /* B es el proceso hijo */ TABLA DE NODOS I count 2 pipe count 3 /dev/tty