Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Operativos I
La concurrencia en Unix
La llamada fork()
Crea un nuevo proceso. Sintaxis: int fork () Descripcin: fork() crea un nuevo proceso. El nuevo proceso (proceso hijo) es una copia exacta del proceso que mando llamar a la funcin fork() excepto por lo siguiente: - El proceso hijo tiene un nico ID de proceso. El ID del proceso hijo no coincide con ningn ID de los procesos activos del grupo.
- El proceso hijo tiene un ID de proceso padre diferente. (el ID del proceso que mando llamar a la funcin fork).
Diapo. No. 1
Sist. Operativos I
La concurrencia en Unix
La funcin es llamada una vez, (por el padre), pero regresa dos veces: (a) una en el padre (b) una en el hijo Si algo sale mal regresa un -1 regresa id del hijo regresa el valor de 0
2. Proceso quiere ejecutar otro programa sin perder su contexto: Proceso crea una copia del proceso y la copia se encarga de ejecutar lo que quiera el proceso Ejemplo: shells
Diapo. No. 2
Sist. Operativos I
La concurrencia en Unix
main ( ) { int i, j, n; float r=12.6; i = 123; j = 99; n= fork( ); printf (Hello \n); }
Diapo. No. 3
Sist. Operativos I
La concurrencia en Unix
proceso hijo
Diapo. No. 4
Sist. Operativos I
La concurrencia en Unix
15
HEAP STACK Informacin: -edo. proceso -swappe -tiempo residencia -prioridad DATOS
Nmero de proceso
NO SWAPPEABLE
SWAPPEABLE
Diapo. No. 5
Sist. Operativos I
La concurrencia en Unix
CODIGO
2 Tabla de procesos
15
10
Tabla de archivos abiertos
AREA U
AREA U
15
Copia
NO SWAPPEABLE
MEMORIA
SWAPPEABLE
Diapo. No. 6
Sist. Operativos I
La concurrencia en Unix
Los identificadores relacionados a un proceso pueden ser conocidos partir de las llamadas getpid y getppid int getpid() int getppid()
getpid() regresa el identificador del proceso que se est ejecutando en ese momento
getppid() regresa el identificador del padre del proceso que se est ejecutando
Diapo. No. 7
Sist. Operativos I
La concurrencia en Unix
Diapo. No. 8
Sist. Operativos I
La concurrencia en Unix
Diapo. No. 9
Sist. Operativos I
La concurrencia en Unix
Diapo. No. 10
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
rogomez@armagnac: 252:>exfork2 Dentro proceso hijo con fork:0 Dentro proceso padre con fork:5182 Id. proceso hijo: 5182 Id. proceso padre:5181 Fin proceso padre rogomez@armagnac:253:>exfork2 Dentro proceso hijo con fork:0 Id. proceso hijo:5184 Dentro proceso padre con fork:5184 Id. proceso padre:5183 Fin del proceso padre rogomez@armagnac :254:>
Dr. Roberto Gmez Diapo. No. 12
Sist. Operativos I
La concurrencia en Unix
#include<stdio.h> main() { int i, n; if ((n =fork()) = = -1) { fprintf(stderr,Error en creacin del proceso \n); exit(1); } else if (n= = 0) /* es un proceso hijo */ print(\t \tProceso hijo; id:% \n, getpid()); else /* es un proceso padre */ printf(Proceso PADRE; id:%d\n, getpid()); for (i=0; i< 3; i++) printf(Cdigo ejecutado por: %d\n, getpid()); }
Diapo. No. 13
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
Diapo. No. 15
Sist. Operativos I
La concurrencia en Unix
#include<stdio.h> main() { int i,m,n; if ((n=fork()) = = -1) { fprintf(stderr,Error en la creacin de procesos \n); exit (1); } else if (n = =0) /* Es el hijo */ for (i=0;i<7; i++){ print(\t\t\t Proceso HIJO con id: %d, valor i: %d\n, getpid(),i); sleep(0); } else /* Es el padre */ for (i=0;i<7;; i++){ printf(Proceso PADRE con id:%d, valor i: %d\n, getpid(),i); sleep(0); } }
Diapo. No. 16
Sist. Operativos I
La concurrencia en Unix
Diapo. No. 17
Sist. Operativos I
La concurrencia en Unix
rogomez@armagnac:28:>padhijo7 Proceso PADRE con id: 1928, valor i:0 Proceso PADRE con id: 1928, valor i:1 Proceso PADRE con id: 1928, valor i:2 Proceso PADRE con id: 1928, valor i:3 Proceso PADRE con id: 1928, valor i:4 Proceso PADRE con id: 1928, valor i:5 Proceso PADRE con id: 1928, valor i:6 rogomez@armagnac:29:>Proceso HIJO con id: 1929, valor i:0 Proceso HIJO con id: 1929, valor i:1 Proceso HIJO con id: 1929, valor i:2 Proceso HIJO con id: 1929, valor i:3 Proceso HIJO con id: 1929, valor i:4 Proceso HIJO con id: 1929, valor i:5 Proceso HIJO con id: 1929, valor i:6 rogomez@armagnac:30:>
Diapo. No. 18
Sist. Operativos I
La concurrencia en Unix
rogomez@armagnac:29:> padhijo7 Proceso HIJO con id: 1931, valor 1:0 Proceso HIJO con id: 1931, valor 1:1 Proceso HIJO con id: 1931, valor 1:2 Proceso HIJO con id: 1931, valor 1:3 Proceso HIJO con id: 1931, valor 1:4 Proceso HIJO con id: 1931, valor 1:5 Proceso HIJO con id: 1931, valor 1:6 Proceso PADRE con id: 1930, valor 1:0 Proceso PADRE con id: 1930, valor 1:1 Proceso PADRE con id: 1930, valor 1:2 Proceso PADRE con id: 1930, valor 1:3 Proceso PADRE con id: 1930, valor 1:4 Proceso PADRE con id: 1930, valor 1:5 Proceso PADRE con id: 1930, valor 1:6 rogomez@armagnac:30:>
Diapo. No. 19
Sist. Operativos I
La concurrencia en Unix
Espera que un proceso hijo termine. Sintaxis: int wait(n) int n Descripcin: Espera hasta que todos los procesos que se ejecutaron en background (con & o bg) terminen y reporta las terminaciones anormales. Ya que wait debe ser ejecutada en el proceso padre, el mismo shell ejecuta un wait, sin haber creado un nuevo proceso.
Diapo. No. 20
Sist. Operativos I
La concurrencia en Unix
main() { int n: if ( (n=fork()) == -1) { fprintf(stderr, Error creacin proceso \n!); exit(1) } else if (n == 0) printf(Hijo \n); else { printf(Padre \n); wait(0); printf(Ya termino el hijo \n); } }
Diapo. No. 21
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
rogomez @armagnac:41: >exwait2 hijo id: 488, valor de i:1 hijo id: 488, valor de i:2 hijo id: 488, valor de i:3 hijo id: 488, valor de i:4 hijo id: 488, valor de i:5 Prueba del wait: ANTES del for PADRE id:487, valor de i:1 PADRE id:487, valor de i:2 PADRE id:487, valor de i:3 PADRE id:487, valor de i:4 PADRE id:487, valor de i:5 Prueba del wait: DESPUES del for rogomez @armagnac:42:>
Diapo. No. 25
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
rogomez @armagnac:134: >exwait2 hijo id: 529, valor de i:1 Prueba del wait: ANTES del for PADRE id: 528, valor i:1 PADRE id: 528, valor i:2 PADRE id: 528, valor i:3 PADRE id: 528, valor i:4 PADRE id: 528, valor i:5 hijo id: 529, valor de i:2 hijo id: 529, valor de i:3 hijo id: 529, valor de i:4 hijo id: 529, valor de i:5 Prueba del wait: DESPUES del for rogomez @armagnac:135: >
Diapo. No. 27
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
Relacin entre las llamadas wait() y exit() + Verificacin del estatus de terminacin de un proceso. + Usar primitiva wait():
Sist. Operativos I
La concurrencia en Unix
Status de terminacin
Si termin normalmente
Los ocho bits ms significativos *n reciben el valor de 8 bits menos significativos del parmetro exit() y los otros ocho bits son cero.
Diapo. No. 30
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
La llamada waitpid()
Espera a que el proceso hijo cambie de estado. Sintaxis: #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *stat_loc, int options); Descripcin: Suspende la ejecucin del proceso hasta que uno de sus hijos cambia de estado. Si el proceso hijo cambia de estado antes de la llamada waitpid(), el regreso es inmediato. Parmetro stat_loc recupera el status de terminacin del proceso que se espera Parmetro options especifica opciones de espera Parmetro pid especifica un conjunto de procesos hijos de los cuales se est solicitando el estatus. Si es igual a Igual a -1 .- Se pide el estatus de cualquier hijo. Mayor que 0.- Especifica el identificador del proceso hijo del que se solicita el estatus. Igual a 0 .- Se solicita el estatus de cualquier proceso hijo cuyo identificador de grupo sea igual al del proceso que lo mand llamar. Menor que -1 .- Solicita el estatus de cualquier proceso hijo cuyo identificador de grupo sea el valor absoluto del valor de pid.
Dr. Roberto Gmez Diapo. No. 33
Sist. Operativos I
La concurrencia en Unix
Si regresa porque el estatus del proceso hijo est disponible entonces regresa un valor igual al identificador del proceso hijo cuyo estatus se est reportando.
Si regresa debido al arribo de una seal al proceso padre, el valor de -1 es regresado y errno se asigna a EINTR.
Si fue invocada con WNOHANG como opcin, y no est disponible el estatus de al menos un proceso especificado en pid se regresa el valor de 0.
Diapo. No. 34
Sist. Operativos I
La concurrencia en Unix
if ( (uno = fork()) == 0) { /* primer hijo */ tmp = (random()%10); printf(Proceso uno (%d) a dormir %d sgs \n, getpid(), tmp); sleep(tmp); printf(Proceso uno termino \n); } else if ( (dos = fork()) == 0) { /* segundo hijo */ tmp=(random()%10); printf(\t Proceso dos (%d) a dormir %d sgs \n, getpid(), tmp); sleep(tmp); printf(\t Proceso dos termino \n); } else if ( (tres = fork()) == 0) { /* tercer hijo */ tmp=(random()%10); printf(\t\t Proceso tres (%d) a dormir %d sgs \n, getpid(), tmp); sleep(tmp); printf(\t\t Proceso tres termino \n); }
Dr. Roberto Gmez Diapo. No. 35
Sist. Operativos I
La concurrencia en Unix
else {
/* Codigo proceso padre */ printf(\t\t\t Esperando que el proceso dos, (%d) termine, dos); retval = waitpid(dos, &status, 0); printf(\t\t\t Proceso dos (%d) , retval); printf(termino con status: %d \n, status);
} }
Diapo. No. 36
Sist. Operativos I
La concurrencia en Unix
Ejemplo ejecucin
rogomez@armagnac:330>cc exwaitpid.c -o corre rogomez@armagnac:331>corre Proceso uno (4292) a dormir 3 segs. Proceso dos (4293) a dormir 3 segs. Proceso tres (4294) a dormir 3 segs. Esperando que el proceso dos termine Proceso uno termino Proceso dos termino Proceso dos (4293) termino con estatus: 256 rogomez@armagnac:332> Proceso tres termino rogomez@armagnac:332>corre Proceso dos (4297) a dormir 3 segs. Proceso uno (4296) a dormir 3 segs. Proceso tres (4298) a dormir 3 segs. Esperando que el proceso dos termine Proceso dos termino Proceso dos (4297) termino con estatus: 256 Proceso uno termino rogomez@armagnac:333> Proceso tres termino rogomez@armagnac:333>corre Proceso dos (4306) a dormir 3 segs. Proceso tres (4307) a dormir 3 segs. Esperando que el proceso dos termine Proceso uno (4305) a dormir 3 segs. Proceso dos termino Proceso dos (4306) termino con estatus: 256 rogomez@armagnac:334> Proceso tres termino Proceso uno termino rogomez@armagnac:334>
Dr. Roberto Gmez Diapo. No. 37
Sist. Operativos I
La concurrencia en Unix
Sist. Operativos I
La concurrencia en Unix
Ambiente?
Heredada Nueva
Ambiente?
Nueva
Heredada
Argumentos?
Lista explcita
Argumentos?
Lista explcita
Inexistente Argumentos?
Vector Arreglo Lista explcita Vector Arreglo
Vector Arreglo
execl()
execv() execle()
execve()
execlp() execvp()
Diapo. No. 39
Sist. Operativos I
La concurrencia en Unix
int execl(path, arg0, arg1, ...., argn, (char)*0) char*path, *arg0, *arg1, ...., *argn int execv(path, argv) char *path, *argv[] int execle (path, arg0, arg1, ..., argn, (char)*0, envp) char *path, *arg0, *arg1, ..., *argn, *envp[] int execve (path, argv, envp) char *path, *argv[], *envp[] int execlp (file, arg0, arg1, ..., argn, (char)*0) char *file, *arg0, *arg1, ..., *argn int execvp (file, argv) char *file, *argv[] envp - Arreglo de apuntadores a caracteres que constituyen el ambiente en el que se va ejecutar el nuevo programa. Termina con un apuntador a NULL.
Dr. Roberto Gmez Diapo. No. 40
Sist. Operativos I
La concurrencia en Unix
Nmero de argumentos
Variables de ambiente
Diapo. No. 41
Sist. Operativos I
La concurrencia en Unix
Cdigo ejemplo
Diapo. No. 42
Sist. Operativos I
La concurrencia en Unix
Ejecucin cdigo
rogomez@armagnac:205>gcc args2.c -o args2 rogomez@armagnac:206>args2 uno dos tres Argumento 0: args2 Argumento 1: uno Argumento 2: dos Argumento 3: tres _=/usr/local/bin/tcsh SESSIONTYPE=altDt DTXSERVERLOCATION=local LANG=en_US HELPPATH=/usr/openwin/lib/locale:/usr/openwin/lib/help PATH=.:/home/rogomez:/usr/local/tex/bin/sparc-sun-solaris2.6: WINDOW_TERMIOS= DISPLAY=:0.0 : : GROUP=unknown HOST=armagnac.cem.itesm.mx : : MSDOS_CMDS=/usr/local/mtools IOFFICE_ROOT=/usr/local/ioffice/bin rogomez@armagnac:207>
Diapo. No. 43
Sist. Operativos I
La concurrencia en Unix
Ejemplo: execlp
Argumentos
Diapo. No. 44
Sist. Operativos I
La concurrencia en Unix
// Programa que imprime un menu de comandos y ejecuta el // comando seleccionado #include <stdio.h> main() { /*lista de comandos */ static char *cmd[] = {who, ls, date}; int i; printf(0>who 1>ls 2>date ); scanf(%d, &i); execlp(cmd[i], cmd[i], 0); printf(No se encontr el comando seleccionado \n); }
Diapo. No. 45
Sist. Operativos I
La concurrencia en Unix
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <errno.h> main(int argc, char *argv[]) { int estatus; pid_t idhijo, waitreturn; if ((idhijo = fork()) == -1) { fprintf(stderr, Error en el fork \n); exit(1); } else if (idhijo == 0) { if (execlp(argv[1], argv[1], 0) < 0) { fprintf(stderr, Error en la ejecucion de %s \n, argv[1]); exit(1); } } else while ( idhijo != (waitreturn = waitpid (-1, &status, WNOHANG))) if ( !((waitreturn == -1) && (errno != EINTR)) ) break; exit(0); }
Dr. Roberto Gmez Diapo. No. 46
Sist. Operativos I
La concurrencia en Unix
#include <errno.h> char *argv[10]; main() { /* comando = ls l tarea* argv[0]="ls"; argv[1]="-l"; argv[2]="tarea*"; argv[3]=(char *)0; */
Diapo. No. 47
Sist. Operativos I
La concurrencia en Unix
if ( (pid = fork()) < 0 ) fprintf(stderr,"Error en el fork() \n"); else if (pid == 0) { execle("/usr/bin/uname", "-a", (char *)0, env_init); fprintf(stderr,"Error %d en el execle() \n",errno); exit(1); } if ( waitpid(pid,NULL,0) < 0 ) fprintf(stderr,"Error en el wait() \n"); printf("Fin del ejemplo \n"); exit(0);
} rogomez@armagnac:243>gcc ej-execle.c -o ejemplo rogomez@armagnac:244>ejemplo SunOS Fin del ejemplo rogomez@armagnac:245>
Dr. Roberto Gmez Diapo. No. 48