PDF de programación - Capítulo 7. Programación de procesos y hebras

Capítulo 7. Programación de procesos y hebrasgráfica de visualizaciones

Publicado el 17 de Julio del 2017
273 visualizaciones desde el 17 de Julio del 2017
89,2 KB
4 paginas
Creado hace 9a (30/07/2014)
Capítulo 7. Programación de procesos y
hebras

7.1. Objetivos

Entender los mecanismos de creación y terminación de procesos de Unix. Iniciarse con las hebras.

7.2. Documentación de las transparencias

Las transparencias relevantes para realizar esta práctica son:
- Páginas 38-42 de las transparencias de C
- Páginas 12-24 y 33-35 de las transparencias de Bibliotecas de C y llamadas al sistema

7.3. Requisitos

Estudio del control de procesos de Unix. Estudio de las funciones fork, wait y sleep, write y exit.

7.4. Creación simple de procesos

Compile el programa pfork.c:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

const int nc= 10;
int i, j;
char c;

int main(int argc, char *argv[])
{

int np= atoi(argv[1]);

for (i = 1; i <= np; i++) {

if (fork() == 0) {

for (j = 0; j < nc; j++) {

c = ’A’ + i - 1;
write(1, &c, 1);
sleep(i);

}
exit(0);

}

}
exit(0);

}

1

Capítulo 7. Programación de procesos y hebras

y ejecútelo con diferentes parámetros, explicando los resultados. Pruebe, por ejemplo, con 3
procesos:

./pfork 3

Utilice ps para ver los procesos que se han creado y vea que uno desaparece al cabo de 10 segundos,
el segundo al cabo de 20 segundos y el tercero al cabo de 30 segundos. Con la opción -l puede ver
también el identificador de proceso del padre (PPID). Observe que todos ellos son hijos del proceso
1, ya que su padre ha terminado inmediatamente y han quedado huérfanos.

7.5. Espera por la terminación

Ahora ejecute de la siguiente modificación (pforkwait.c), explicando el resultado:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

const int nc= 10;
int i, j;
int pidfork, pidwait, estado;
char c;

int main(int argc, char *argv[])
{

int np= atoi(argv[1]);

for (i = 1; i <= np; i++) {

if ((pidfork = fork()) == 0) {
for (j = 0; j < nc; j++) {

c = ’A’ + i - 1;
write(1, &c, 1);
sleep(i);

}
exit(0);

}
printf("Arrancado el proceso %d\n", pidfork);

}
for (i = 1; i <= np; i++) {

pidwait = wait(&estado);
printf("Termina el proceso %d", pidwait);
if (WIFEXITED(estado)) printf(" con exit(%d)\n", WEXITSTATUS(estado));
else if (WIFSIGNALED(estado)) printf(" con la señal %d\n", WTERMSIG(estado));

}
exit(0);

}

Ejecútelo también en la sombra (background) y vea el número de procesos y las relaciones de
paternidad. Pueden usar las opciones fu de ps para verlo gráficamente (con esta opción también
vemos todos los procesos del usuario ligados a cualquier terminal). Durante el funcionamiento mate
alguno de los hijos con kill pid y vea como se reporta.

2

Capítulo 7. Programación de procesos y hebras

7.6. Trazas para ver llamadas al sistema

Use strace con la opción -f para buscar las verdaderas llamadas al sistema de fork, wait, sleep y
exit. Observe que la de fork (clone) también sirve para crear hebras. Ojo, la que aparece en las
trazas no es la del manual, sino sys_clone.

7.7. Uso rudimentario de hebras

Podemos usar la función clone de GNU para crear hebras si la llamamos con ciertos parámetros. El
primero la función a ejecutar en la hebra, la segunda la pila a usar (la ponemos muy grande para no
tener problemas). Como al mayoría de las arquitecturas tiene pilas que crecen hacia abajo, hay que
ajustar la pila a su dirección superior. Las variables locales de cada hebra hay que ponerlas en la
función, para que vaya una copia distinta en cada pila. Para que sean hebras reales hay que compartir
la memoria virtual y el sistema de ficheros, al menos (CLONE_VM|CLONE_FILES). Finalmente hay
que pasar un parámetro para diferenciar lo que hace cada hebra. Este programa: (pclone1.c)
debería funcionar perfectamente:

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>

const int nc= 10;

int escribe(void* pc)
{

int i, j;
char c;
i= *(int*)pc;
for (j = 0; j < nc; j++) {

c = ’A’ + i - 1;
write(1, &c, 1);
sleep(i);

}
return(0);

}

int main(int argc, char *argv[])
{

int i;
int np= atoi(argv[1]);
for (i = 1; i <= np; i++)

clone(escribe, malloc(100000)+100000, CLONE_VM | CLONE_FILES, &i);

exit(0);

}

y, sin embargo no lo hace, ya que a las hebras no les da tiempo a recoger el parámetro. Hace falta
algo de sincronización. Aquí (pclone2.c) lo haremos con espera activa; en Laboratorio de
Programación de Sistemas se estudiarán mecanismos mejores:

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>

3

Capítulo 7. Programación de procesos y hebras

#include <stdlib.h>
#include <sched.h>

const int nc= 10;
int cogido=0;

int escribe(void* pc)
{

int i, j;
char c;
i= *(int*)pc;
cogido=1;
for (j = 0; j < nc; j++) {

c = ’A’ + i - 1;
write(1, &c, 1);
sleep(i);

}
return(0);

}

int main(int argc, char *argv[])
{

int i;
int np= atoi(argv[1]);
for (i = 1; i <= np; i++) {

clone(escribe, malloc(100000)+100000, CLONE_VM | CLONE_FILES, &i);
cogido=0;
while (!cogido);

}
exit(0);

}

7.8. Ficheros ofrecidos

En el directorio procesos

• pfork.c.
• pforkwait.c.
• pclone1.c.
• pclone2.c.

7.9. Resultados pedidos

• Explicación del funcionamiento de pfork.c y pforkwait.c.
• Explicación del número de procesos visibles en las ejecuciones de ambos programas y sus

relaciones de paternidad.

• Explicación del funcionamiento de pclone2.c.

4
  • Links de descarga
http://lwp-l.com/pdf5433

Comentarios de: Capítulo 7. Programación de procesos y hebras (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad