Está en la página 1de 12

FIB Tardor 02

PROCESOS UNIX

Gestión de procesos en UNIX

• Cada proceso sólo puede tener un flujo: el concepto “proceso” engloba todo
• Dos llamadas implicadas en la creación de procesos
• crear proceso
• cargar programa
• La relación de procesos es jerárquica: hijos, padres, abuelos...
• El mecanismo de signals permite que el proceso sea avisado de acontecimientos
• A través del sistema de ficheros, los procesos pueden pasarse datos

Introducció als Sistemes Operatius Marisa Gil 1


FIB Tardor 02

PROCESOS UNIX

Creación de procesos
#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
MEMORIA MEMORIA
PCB
IPC fork(); fork();
id:098 IPC sentencia a;
sentencia a;
sentencia b; sentencia b;
......... .........
PCB xxxx
yyyyy
id:098

PCB fork();
xxxx IPC sentencia a;
yyyyy id:103 sentencia b;
.........
xxxx
yyyyy
Antes del fork() Después del fork()

Introducció als Sistemes Operatius Marisa Gil 2


FIB Tardor 02

PROCESOS UNIX

Cambio de imagen del proceso que se está ejecutando

#include <unistd.h>

int execl(const char *path,const char *arg0,...,const char *argn,


char * /*NULL*/);
int execv(const char *path, char *const argv[]);
int execle(const char *path,char *const arg0[],...,const char *argn,
char * /*NULL*/,char *const envp[]);
int execve(const char *path, char *const argv[],char *const envp[]);
int execlp(const char *file,const char *arg0,...,const char *argn,
char * /*NULL*/);

Introducció als Sistemes Operatius Marisa Gil 3


FIB Tardor 02

PROCESOS UNIX

Sincronización padre-hijo

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

pid_t wait(int *stat_loc);

#include <stdlib.h>

void exit(int status);

#include <unistd.h>
void _exit(int status);

Introducció als Sistemes Operatius Marisa Gil 4


FIB Tardor 02

PROCESOS EN UNIX

Extraído de Amir Afzal: “Introducción a UNIX. Un enfoque práctico”. Prentice Hall

PCB de
proceso del
sistema crear un nuevo proceso (hijo)

añadir proceso hijo a la tabla de procesos

almacenar la dirección de retorno fork


call fork
del padre en el PCB del padre

enviar el código 0 al proceso hijo

devolver el ID del proceso hijo al padre

devolver control al proceso padre

padre LLAMADA fork() hijo

Introducció als Sistemes Operatius Marisa Gil 5


FIB Tardor 02

PROCESOS EN UNIX

PCB de
proceso del
sistema cambiar el estado del proceso
padre a esperar (bloqueado)

fork
fork
dar el control al proceso hijo
call wait

el padre va a estar bloqueado


hasta que el hijo finalice

LLAMADA wait() hijo


padre

Introducció als Sistemes Operatius Marisa Gil 6


FIB Tardor 02

PROCESOS EN UNIX

PCB de
proceso del
cambiar el estado del proceso sistema
hijo a ejecutando

fork
fork
carga el nuevo programa ejecutable
en memoria
call exec

comienza la ejecución del nuevo programa nuevo


programa

LLAMADA exec() hijo


padre

Introducció als Sistemes Operatius Marisa Gil 7


FIB Tardor 02

PROCESOS EN UNIX

PCB de PCB de
proceso del proceso del
sistema cambia el estado del padre a preparado sistema

pasar al padre el valor del hijo


fork
fork

wait avisar al padre de que el


hijo ha muerto (signal)

el padre se despierta

el padre continua su programa

call exit

padre LLAMADA exit() hijo

Introducció als Sistemes Operatius Marisa Gil 8


FIB Tardor 02

PROCESOS EN UNIX

Esquemas de creación de procesos

pid = fork();

switch(pid) {

case 0: /* código del hijo */


seguir código execlp(“proghijo”, hijo,0);
exit(resultado)/ break;

case -1: /* error */


default: /* código del padre */
seguir código execlp(“progpadre”, padre,0);
wait(&resultado)/ break;

Introducció als Sistemes Operatius Marisa Gil 9


FIB Tardor 02

EJEMPLOS

#include "error.h"

main()
{
int contador=0,r, status;
char c,s[100];

switch (fork()) {
case -1: error("fork",SISTEMA);

case 0: while ((r=read(0, &c,sizeof(char)))>0)


if (c==’a’) contador++;
if (r<0) error("read",SISTEMA);
sprintf(s,"Soy %d: contador=%d\n",getpid(),contador);
exit(0);
default: /* codigo del padre */
wait(&status);
}
}

Introducció als Sistemes Operatius Marisa Gil 10


FIB Tardor 02

PROCESOS EN UNIX

Comunicación padre hijo en la finalización

• La información que se pasan a través de las llamadas wait() y exit() es un


acuerdo entre el padre y el hijo:
• Totalmente arbitrario
• transparente al sistema operativo y a las librerías
• Por convenio e inteligibilidad de los programas, en las utilidades y programas de
uso general se establece que:
• Devolver un 0 es una finalización correcta
• Devolver un valor diferente de 0 es una finalización errónea

Introducció als Sistemes Operatius Marisa Gil 11


FIB Tardor 02

PROCESOS EN UNIX

wait (&stat)

8 bits altos 8 bits bajos

wait (&stat) TODO A CEROS

exit (res)

8 bits altos 8 bits bajos

TODO A CEROS
wait (&stat)

número de excepción

Introducció als Sistemes Operatius Marisa Gil 12

También podría gustarte