Universidad de El Salvador Facultad Multidisciplinaria de Occidente Departamento de Ingeniería y arquitectura Sistemas Operativos
Contenido: Guía de trabajo 5
Docente: Ing. Luis Barrera
Alumnos: Rosales Hernandez, Mauricio Giovany
Fecha de Entrega: Jueves 9 de octubre de 2014
RH08017
PRACTICA 1 1.
[1]4564
2.
p-padre PID 4264 p-hijo PID 4565
3.
p-padre: 427 p-hijo: 427
4.
Determina el tiempo de ejecucion del proceso
5.
Indica que hay un error en la llamada al sistema
6. La primera instruccion que ejecuta el proceso hijo es la de capturar el id propio 7. El valor de la Variable cont_fork es de 110 al finalizar el proceso padre
PRACTICA 2 1.
Los argumentos de p1 son: ./p1 Los argumentos de p1 son: p2
2.
El PID de p1 es: 6604 El PID de p2 es: 6604
3.
El tamanio de p1 es: 1049 El tamanio de p2 es: 1508
PRACTICA 3 1.
Proceso padre i= 1,3,5,7,9 y 11 Proceso hijo i= 0,2,4,6,8 y 10 La variable i del proceso padre no del proceso hijo, sin embargo las variables j de las dos valores
j=0,1,2,3,4 j=0,1,2,3,4 es igual a la variable i si toman los mismos
2. Se cambio a 0 el valor de la variable i que esta en el case default para que los
dos procesos iniciaran con i=0 y se quito un i++; que estaba dentro del for del proceso padre.
PRACTICA 4 1. Para que el proceso padre imprima el mensaje de finalizacion 10 seg mas tarde que el mensaje de finalizacion del proceso hijo se agrego sleep(10); despues de wait en el case default del proceso padre. Quedando el codigo de la siguiente manera: /* * File: pwait1.c * Author: logan * * Created on 23 de septiembre de 2014, 08:27 PM */ #include #include int main() { pid_t pid; pid = fork(); switch (pid) { case -1: printf("\nERROR.- No se ha podido crear el proceso hijo.-"); break; case 0: printf("\nSoy el Proceso Hijo, mi PID es %d y mi PPID es %d\n", getpid(), getppid()); sleep(10); break; default: printf("\nSoy el Proceso Padre, mi PID es %d y el PID de mi Hijo es: %d\n", getpid(), pid); wait(0); sleep(10); } printf("\nFinal de ejecucion de %d \n", getpid()); return (EXIT_SUCCESS); }
2. Como no hay espera entre los case el id del proceso hijo sigue siendo el mismo que se asigno aunque ya haya
finalizado el proceso padre. El PID del proceso hijo es 7736 y el del proceso padre 7735
PRACTICA 5: JERARQUIA DE PROCESOS 1 ¿Por qué al ejecutar el programa aparecen mensajes repetidos?
Aparecen mensajes repetidos porque la orden printf, la que hay dentro del bucle, la ejecuta cada proceso hijo una primera vez tras ser creado como resultado de la llamada al sistema fork que hay justo en la línea anterior del printf (pid=fork()), y una segunda vez en la siguiente iteración del bucle, en la última iteración ya no se repite.
Preste especial atención al orden de terminación de los procesos ¿Què observa? ¿Por qué?
El último en terminar es el proceso padre. Porque la llamada al sistema wait, que hace que el proceso padre pasa a un estado bloqueado hasta que un proceso hijo termine, el está dentro de un for que va a hacer que se llame tantas veces como procesos hijos el haya creado.
PRACTICA 6: JERARQUIA DE PROCESOS 2 Dibuje la estructura de la jerarquía de procesos que se obtiene al ejecutar el siguiente fragmento de código en C
PROCESO INICIAL
A
B
A
C
B
B
C
C
B
C
C
PRACTICA 7: JERARQUIA DE PROCESOS 3 Dibuje la jerarquía de procesos que resulta cuando se ejecuta el código y el valor de n=3
PROCESO INICIAL
A
B
B
C
C
C
C Indique en que procesos se ha cambiado la imagen del proceso cuando se utiliza la función execlp
C
En el proceso C exactamente donde se ejecuta “ls”
PRACTICA 8: JERARQUIA DE PROCESOS 4 Escriba un programa en C, que genere la jerarquía de procesos que se muestra en la figura, los valores de profundidad y anchura de la jerarquía son dados como parámetros en la línea de comandos por el usuario en cada ejecución
//UNIVERSIDAD DE EL SALVADOR //FACULTAD MULTIDISCIPLINARIA DE OCCIDENTE //SISTEMAS OPERATIVOS //PROGRAMA: jerar4.c int main (int argc, char ∗argv[]) { int i; int prf, anc; if (argc!= 3) exit(0); profundidad= atoi(argv[1]); /∗ profundidad ∗/ anchura= atoi(argv[2]); /∗ anchura ∗/ for (prf= 0; prf< profundidad-1; prf++) if (fork()!= 0) / *jerarquía*/ break; for (anc= 0; anc< anchura-1; anc++) if (fork()== 0) /*jerarquía*/ break; printf("Soy el proceso %d y mi padre es %d\n", getpid(), getppid()); sleep (2); return 0; }
Modifique el programa anterior para que la expansión de la anchura de la jerarquía se produzca solamente en aquellos niveles de profundidad par (y distinta de cero)
//UNIVERSIDAD DE EL SALVADOR //FACULTAD MULTIDISCIPLINARIA DE OCCIDENTE //SISTEMAS OPERATIVOS //PROGRAMA: jerar4mod.c int main (int argc, char ∗argv[]) { int i;
int prf, anc; if (argc!= 3) exit(0); profundidad= atoi(argv[1]); /∗ profundidad ∗/ anchura= atoi(argv[2]); /∗ anchura ∗/ for (prf= 0; prf< profundidad-1; prf++) if (fork()!= 0) / *jerarquía*/ break; if ((prf!= 0) && (prf %2== 0)) /*expansion del programa*/ { for (anc= 0; anc< anchura-1; anc++) if (fork()== 0) /*jerarquía*/ break; } printf("Soy el proceso %d y mi padre es %d\n", getpid(), getppid()); sleep (2); return 0; }
PRACTICA 9. PROCESOS E HIJOS
//UNIVERSIDAD DE EL SALVADOR //FACULTAD MULTIDISCIPLINARIA DE OCCIDENTE //SISTEMAS OPERATIVOS //PROGRAMA: prochij.c #include #include #include #include #include float td; main(int argc, char *argv[]) { int cont,pid,status; cont=atoi(argv[1]); printf("\n\nYo soy el Proceso original con PID %d\n",getpid()); while(cont!=0) { pid = fork(); //Duplica. Hijo y padre continuan desde aquí if (pid != 0) //Es el padre si PID no es cero { waitpid(pid,&status,0); printf("\nSoy el proceso padre con PID %d \n",getpid()); printf("El PID de mi hijo que ha terminado es %d\n y duró %f segundos",pid,status/0377); } else //si pid es cero, entonces es el hijo. { printf("\nSoy el proceso hijo con PID %d, y PPID %d. \n",getpid(),getppid()); td = random()%10; printf("%f",td); sleep(td); // printf("Sali del sueño"); exit(td); } printf("\nPID %d ha terminado.\n\n",getpid()); //ambos procesos ejecutan esto. cont--;
// }
exit(42); }