posix

Anuncio
3/12/15
Sistemas Operativos
Llamadas al Sistema
POSIX
Servicios de gestión de procesos (POSIX)
•
•
•
•
•
•
•
Identificación de procesos
Entorno de un proceso
Creación de procesos
Cambio del programa de un proceso
Esperar la terminación de un proceso
Finalizar la ejecución de un proceso
Información sobre procesos
ARCO 2015
2
Procesos
1
3/12/15
Servicios gestión de procesos (POSIX)
pid_t fork(void)
– Crea un proceso hijo. Devuelve 0 al proceso hijo y el pid del hijo al proceso padre.
int execl(const char *path, const char *arg, ...)
int execlp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv[])
– Permite a un proceso ejecutar un programa (código) distinto.
Cambia la imagen de memoria del proceso.El pid no cambia.
pid_t wait(int *status)
– Permite a un proceso padre esperar hasta que termine un proceso
hijo. Devuelve el identificador del proceso hijo y el estado de terminación del mismo.
void exit(int status)
– Finaliza la ejecución de un proceso indicando el estado de terminación del mismo.
pid_t getpid(void)
– Devuelve el identificador del proceso.
pid_t getppid(void)
– Devuelve el identificador del proceso padre.
ARCO 2015
3
Procesos
Servicios POSIX: fork
• El fork crea un proceso clonando al padre
Mapa de
m em oria
Im agen del
proceso A
Tabla de procesos
BCP
A
El proc eso A hac e un fork y crea
el proceso hijo B
Mapa de
m em oria
Im agen del
proceso A
Im agen del
proceso B
ARCO 2015
Tabla de procesos
BCP
A
BCP
B
4
Nuevo PID
Nueva descripción de m em oria
Distinto valor de retorno (0 en el hijo)
Procesos
2
3/12/15
fork. Crea un proceso
• Servicio:
#include <sys/types.h>
pid_t fork(void);
• Devuelve:
– El identificador de proceso hijo al proceso padre y 0 al
hijo
– -1 el caso de error
• Descripción
:
– Crea un proceso hijo que ejecuta el mismo programa
que el padre
– Hereda los ficheros abiertos (se copian los
descriptores).
– Las alarmas pendientes se desactivan.
ARCO 2015
5
Procesos
Servicios POSIX: exec
• El exec cambia el programa de un proceso
Mapa de
m em oria
Im agen
del proceso
Tabla de procesos
El proc eso hac e un exec
BCP
Mapa de
m em oria
Tabla de procesos
BCP
Se borra la im agen de m em oria
Se borra la desc ripc ión de la m em oria y registros
Se c onserva el PID
Objeto
ejec utable
Bibliotec a
sistem a
ARCO 2015
Cargad or
Mapa de
m em oria
Im agen
del proceso
Tabla de procesos
BCP
6
Se c arga la nueva im agen
Se pone PC en direc c ión de arranque
Se c onservan los fd
Procesos
3
3/12/15
exec. Cambio del programa de un proceso
• Servicios:
int execl(const char *path, const char *arg, ...)
int excelp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv[])
• Argumentos:
– path, file: nombre del archivo ejecutable
– arg: argumentos
• Descripción:
–
–
–
–
–
Devuelve -1 en caso de error, en caso contrario no retorna.
Cambia la imagen de memoria del proceso.
El mismo proceso ejecuta otro programa.
Los ficheros abiertos permanecen abiertos
Las señales con la acción por defecto seguirán por defecto, las señales con manejador tomarán
la acción por defecto.
ARCO 2015
7
Procesos
exit. Terminación de un proceso
• Servicios:
int exit(int status);
• Argumentos:
– Código de retorno al proceso padre
• Descripción:
– Finaliza la ejecución del proceso.
– Se cierran todos los descriptores de ficheros abiertos.
– Se liberan todos los recursos del proceso
ARCO 2015
8
Procesos
4
3/12/15
wait. Espera la terminación de un proceso hijo
• Servicios:
#include <sys/types.h>
pid_t wait(int *status);
• Argumentos:
– Devuelve el código de terminación del proceso hijo.
• Descripción:
– Devuelve el identificador del proceso hijo o -1 en caso
de error.
– Permite a un proceso padre esperar hasta que termine
un proceso hijo. Devuelve el identificador del proceso
hijo y el estado de terminación del mismo.
ARCO 2015
9
Procesos
Uso normal de los servicios
pid P
padre
pid P
padre
fork()
pid H
hijo
pid P
pid P
pid H
exec()
pid P
wait()
pid H
hijo
exit()
pid H
pid H
hijo
pid P
padre
zombie
pid P
texto
datos
pila
Ficheros, tuberías, ...
ARCO 2015
10
Procesos
5
3/12/15
Evolución de procesos
• El padre muere: INIT acepta los hijos
Init
Init
Init
Proceso A
fork()
Proceso A
Proceso A
exit()
Proceso B
Proceso B
ARCO 2015
Init
wait()
Init
wait()
Proceso B
Proceso B
exit()
11
Procesos
Evolución de procesos II
• Zombie: el hijo muere y el padre no hace wait
Init
Init
Init
Init
Init
Proceso A
fork()
Proceso A
Proceso A
Proceso A
Proceso A
wait()
Proceso B
Proceso B
exit()
Proceso B
zombie
Proceso B
zombie
ARCO 2015
12
Procesos
6
3/12/15
Programa de ejemplo I
#include <sys/types.h>
#include <stdio.h>
/* programa que ejecuta el mandato ls -l */
main() {
pid_t pid;
int status;
pid = fork();
if (pid == 0)
{ /* proceso hijo */
execlp("ls","ls","-l",NULL);
exit(-1);
}
else
/* proceso padre */
while (pid != wait(&status));
exit(0);
}
ARCO 2015
13
Procesos
Programa de ejemplo II
#include <sys/types.h>
#include <stdio.h>
main(void) { /* programa que ejecuta el mandato ls -l */
pid_t pid;
int status;
char *argumentos[3];
/* crea los argumentos */
argumentos[0] = "ls";
argumentos[1] = "-l";
argumentos[2] = NULL;
pid = fork();
if (pid == 0) {/* proceso hijo */
execvp(argumentos[0], argumentos);
exit(-1);
} else
/* proceso padre */
while (pid != wait(&status))
continue;
exit(0);
} 2015
ARCO
14
Procesos
7
Descargar