Relación entre las distintas tablas en el sistema

Anuncio
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
Descargar