Professional Documents
Culture Documents
La concurrencia
La llamada fork()
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:
Diapo. No. 1
Sist. operativos. La concurrencia
Diapo. No. 2
Sist. operativos. La concurrencia
main ( )
{
int i, j, n;
float r=12.6;
n= fork(
f k( );)
printf (Hello \n);
Diapo. No. 3
Sist. operativos. La concurrencia
Main()
{
int i, j, n;
float r = -12.6;
i = 123;
j = 99;
n = fork();
123
printf(hello\n);
123 } 99
99 -12.6
-12.6
12 6 hello\n
hello\n
copia
datos de los
datos
proceso
padre pproceso
cdigo compartido hijo
Diapo. No. 4
Sist. operativos. La concurrencia
Tabla de
textos y/o cdigos
CODIGO
Tabla de procesos
15 AREA U
HEAP
STACK
DATOS
Informacin:
-edo. p
proceso
Nmero dde
N
-swappe
proceso
-tiempo residencia
-prioridad
NO SWAPPEABLE SWAPPEABLE
Diapo. No. 5
Sist. operativos. La concurrencia
Tabla de
textos y/o cdigos CODIGO
2
Tabla de procesos
Nmero ltimo
proceso creado
15 10 AREA U AREA U
Tabla
T bl de
d
15 archivos HEAP HEAP
abiertos
STACK STACK
DATOS DATOS
2 Copia
Diapo. No. 6
Sist. operativos. La concurrencia
Diapo. No. 7
Sist. operativos. La concurrencia
#include <stdio.h>
main ()
{
i t n;
int
Diapo. No. 8
Sist. operativos. La concurrencia
ajjaajj@armagnac:243:>exfork1
Dentro proceso hijo con fork:0
Id. proceso hijo:5141
Dentro proceso padre con fork:5141
Id pproceso padre:5140
p
Fin proceso padre
ajjaajj@armagnac :244:>exfork1
Dentro proceso hijo con fork:0
Dentro proceso padre con fork:5145
Id. proceso padre: 5144
Fin proceso padre
ajjaajj@armagnac:246:>Id. proceso hijo: 5145
ajjaajj@armagnac:246:>
Diapo. No. 9
Sist. operativos. La concurrencia
Suspende
S d lla ejecucin
j i de
d un proceso por un intervalo
i t l de
d
tiempo especfico.
Sintaxis:
sleep(time)
Descripcin:
sleep suspende la ejecucin del proceso por un tiempo
determinado especificado
p en segundos.
g Es utilizado ppara
ejecutar un comando despus de un cierto tiempo, por
ejemplo:
sleep(50);
comando;
d
while (1)
{
comando;
ssleep
eep (37);
}
Diapo. No. 10
Sist. operativos. La concurrencia
#include<stdio.h>
main( )
{
int n;
if ((n=fork()) = = -1 ) {
fprintf(stderr,Error creacion hijo \n);
exit(1);
}
else
l
if (n= =0) { /* es un proceso hijo */
printf ( Dentro proceso hijo con fork: %d\n,n);
sleep(5)
printf( Id.
printf( Id proceso hijo: %d\n
%d\n, getpid());
sleep(5);
}
else { /* es un proceso padre */
printf(Dentro
p ( pproceso ppadre con fork: %d\n,, n);
);
sleep(5);
printf( Id. proceso padre:% \n, getpid());
sleep(5);
printf( Fin proceso padre \n);
sleep(5);
}
}
Diapo. No. 11
Sist. operativos. La concurrencia
ajjaajj
jj jj@armagnac:247:>cc
247 exfork2.c
f k2 -o exfork2
f k2
ajjaajj@armagnac:248>exfork2
Dentro proceso hijo con fork:0
Dentro proceso padre con fork: 5153
Id proceso padre: 5152
Id.
Id. proceso hijo: 5153
Fin proceso padre
ajjaajj@armagnac : 249:>
ajjaajj@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
ajjaajj@armagnac:253:>exfork2
Dentro proceso hijo con fork:0
Id. proceso hijo:5184
Dentro proceso padre con fork:5184
Id proceso padre:5183
Id.
Fin del proceso padre
ajjaajj@armagnac :254:>
Diapo. No. 12
Sist. operativos. La concurrencia
#include<stdio.h>
main()
{
int i, n;
Diapo. No. 13
Sist. operativos. La concurrencia
ajjaajj@armagnac:140:>cc
jj jj@ g exph.c
p -o exph
p
ajjaajj@armagnac:141:>exph
Proceso hijo;id:2244
Proceso PADRE: id:2243
Cdigo ejecutado por:2243
Cdigo ejecutado por:2243
Cdigo ejecutado por:2243
ajjaajj@armagnac:142:>Cdigo ejecutado por:2244
Cdigo ejecutado por:2244
Cdigo ejecutado por:2244
ajjaajj@armagnac:142:>exph
Proceso hijo;id:2246
Cdigo ejecutado por:2246
Cdigo ejecutado por:2246
Cdi ejecutado
Cdigo j d por:2246
2246
Proceso PADRE: id:2245
Cdigo ejecutado por:2245
Cdigo ejecutado por:2245
Cdigo ejecutado por:2245
ajjaajj@armagnac:143:>exph
Proceso PADRE:id:2249
Proceso hijo: id:2250
Cdigo ejecutado por:2249
Cdigo ejecutado por:2249
Cdigo ejecutado por:2249
ajjaajj@armagnac:144:>
Diapo. No. 14
Sist. operativos. La concurrencia
Diapo. No. 15
Sist. operativos. La concurrencia
#include<stdio.h>
main()
{
int i,m,n;
if ((n=fork()) = = -1) {
fprintf(stderr Error
fprintf(stderr, Error en la creacin de procesos \n
\n);
);
exit (1);
}
else
if (n = =0) /* Es el hijo */
f (i=0;i<7;
for (i 0 i 7 i++){
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. La concurrencia
ajjaajj@armagnac:28:>
Diapo. No. 17
Sist. operativos. La concurrencia
ajjaajj@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
ajjaajj@armagnac:29:>Proceso HIJO con id: 1929, valor i:0
Proceso HIJO con id: 1929, valor i:1
Proceso HIJO con id: 1929,
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
ajjaajj@armagnac:30:>
Diapo. No. 18
Sist. operativos. La concurrencia
ajjaajj@armagnac:29:>
jj jj@ 29 padhijo7
dhij 7
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,
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
ajjaajj@armagnac:30:>
Diapo. No. 19
Sist. operativos. La concurrencia
Sintaxis:
Si t i
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.
Diapo. No. 20
Sist. operativos. La concurrencia
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();
ait();
printf(Ya termino el hijo \n);
}
}
Diapo. No. 21
Sist. operativos. La concurrencia
main()
{
int n,i;
if ((n=fork())==-1){
printf(Error
i f(E en ell fork()
f k() \n);
\ )
exit(1);
}
else
if (n = = 0){
for (i=1;i<=5; i++){
printf(hijo id: %d, valor de i:%d \n,getpid(),i);
sleep(1);
}
exit(0);
}
else{
printf( Prueba del wait: ANTES del for \n);
/*POS 1*/ /* wait(0); */
for (i=1; i<=5; i++){
printf(\t\t PADRE id: %d, valor i: %d\n,getpid(),i);
sleep(0);
}
/* POS 2*/ wait(0);
printf(Prueba
i tf(P b del d l wait:
it DESPUES del
d l for
f \n);
\ )
}
}
Diapo. No. 23
Sist. operativos. La concurrencia
ajjaajj@armagnac:39:>exwait2
Prueba del wait: ANTES del for
hijo id:484, valor de i :1
hijo id:484, valor de i :2
hijo id:484, valor de i :3
hijo
j id:484,, valor de i :4
hijo id:484, valor de i :5
PADRE id:483, valor i:1
PADRE id:483, valor i:2
PADRE id:483, valor i:3
PADRE id:483
id:483, valor i:4
PADRE id:483, valor i:5
Prueba del wait: DESPUES del for
ajjaajj@armagnac:40:>exwait2
hijo id:486, valor de i:1
P b ddell wait:
Prueba it ANTES deld l for
f
hijo id:486, valor de i:2
hijo id:486, valor de i:3
hijo id:486, valor de i:4
hijo id:486, valor de i:5
PADRE id:485, valor i:1
PADRE id:485, valor i:2
PADRE id:485, valor i:3
PADRE id:485, valor i:4
PADRE id:485,, valor i:5
Prueba del wait: DESPUES del for
ajjaajj @armagnac:41: >
Diapo. No. 24
Sist. operativos. La concurrencia
Diapo. No. 25
Sist. operativos. La concurrencia
Diapo. No. 26
Sist. operativos. La concurrencia
Diapo. No. 27
Sist. operativos. La concurrencia
Sintaxis:
void exit(estatus)
int estatus;
Descripcin:
Diapo. No. 28
Sist. operativos. La concurrencia
Diapo. No. 29
Sist. operativos. La concurrencia
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. La concurrencia
Cdigo toto.c:
main()
{
if (fork() == 0) {
printf(Proceso hijo id: %d \n, getpid());
exit(3);
}
else{
int m,n;
m= wait (&n);
printf( Fin del proceso %d valor regreso: %d n,m,n);
}
Ejemplo corrida:
$cc toto.c
toto c -o
o toto
$toto
Proceso hijo id: 9227
Fin del proceso 9227 valor regreso: 768
$
76810= 00000011000000002
Diapo. No. 31
Sist. operativos. La concurrencia
main()
{
if (fork( ) = = 0) {
printf(Id. proceso hijo: %d n, getpid());
for(;;);
}
else {
int m,n;
m = wait (&n);
printf(Fin del proceso %d valor regreso: %d n, m,n);
La llamada waitpid()
E
Espera a que ell proceso hijo
hij cambie
bi de
d estado.
t d
Sintaxis:
#include <sys/types.h>
#include <sys/wait.h>
Descripcin:
Suspende
p la ejecucin
j del proceso
p hasta que
q 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
De otra manera,
el valor de -1 es regresado, y errno indica el error ocurrido.
Diapo. No. 34
Sist. operativos. La concurrencia
Diapo. No. 36
Sist. operativos. La concurrencia
Ejemplo ejecucin
Diapo. No. 37
Sist. operativos. La concurrencia
Sintaxis:
Depende de los argumentos a pasar.
Descripcin:
p
Proceso no pierde
i d sii pid,
id nii ell de
d su padre,
d y continua
i
con su papel de hijo.
1.. Especificacin
spec cac programa
p og a a a ejecutar
ejecuta
2. Ambiente ejecucin
3. Paso de argumentos
Diapo. No. 38
Sist. operativos. La concurrencia
Relativa
Absoluta
Ambiente? Ambiente?
Heredada N
Nueva
Nueva Heredada
Argumentos?
g Argumentos?
g Inexistente Argumentos?
g
Lista Vector Lista Vector Lista Vector
explcita Arreglo explcita Arreglo explcita Arreglo
Diapo. No. 39
Sist. operativos. La concurrencia
eenvp
vp - Arreglo
eg o de apuntadores
apu tado es a ca
caracteres
acte es que co
constituyen
st tuye el
e
ambiente en el que se va ejecutar el nuevo programa.
Termina con un apuntador a NULL.
Diapo. No. 40
Sist. operativos. La concurrencia
HOME:
HOME
/home/dic/ajjaajj
3 grep
DISPLAY: egarac:0.0
benito
SHELL: /usr/bin/sh
directorio
HOST: armagnac
Diapo. No. 41
Sist. operativos. La concurrencia
Ejemplo: execlp
Argumentos
execlp
p ((sort,, sort,, -n,, foo,, 0))
Diapo. No. 42
Sist. operativos. La concurrencia
#include <stdio.h>
main()
{
/*lista de comandos */
static char *cmd[] = {who, ls, date};
int i;
Diapo. No. 43
Sist. operativos. La concurrencia