Procesos e Hilos En Unix
Procesos e Hilos POSIX
El estándar POSIX
• POSIX: Interfaz de sistemas operativos portables. • Basado en UNIX
– A pesar de que UNIX es ya de por sí estándar, había muchos “sabores” que impositiblitaban la transportabilidad de los programas (código fuente) – Disponible en • UNIX / LINUX • En forma de subsistema en Windows NT / XP – El estándardefine: • Tipos de datos • Nombres de funciones • Valores devueltos por las funciones • Es habitual que los recursos se referencien mediante un número entero >= 0 que recibe el nombre de descriptor.
Creación de Procesos Concurrentes
• Llamada al sistema fork().
– A partir de la devolución del control por parte del sistema, existen en ejecución dos imágenes de memoriabásicamente iguales: el padrey el hijo. – Las diferencias entre ambos procesos son: • PID’s de los procesos – El PID del hijo es distinto al del padre. • En la llamada a fork() el sistema devuelve un 0 al proceso hijo y un valor positivo distinto de 0 (pid del hijo) al padre.
• Recursos compartidos entre el proceso Padre e Hijo
– la imagen en memoria del proceso hijo es una copia igual a la del proceso padre, pero endistinta zonas de memoria. • No se comparten las variables de memoria. – Los recursos que sí comparten son los dispositivos y ficheros que tuviera abiertos el proceso padre. • el stdin, stdout y stderr.
– Esto quiere decir que la salida estándar y salida de error estándar de padre e hijo aparecerán mezcladas.
Fork () - 1
# include main() { int pid;/************************************************ creación de un proceso concurrente con el creador *************************************************/ pid=forck (); if ((pid == -1) { printf ("error en creacion de proceso hijo\n"); exit(1); } else if ( pid == 0) /* proceso hijo */ { printf ("Proceso hijo 1\n"); fflush(stdout); exit (0); /* terminacion con codigo 0 */ } else /* proceso padre */ { printf ("Proceso padre\n"); fflush(stdout);wait (0); } }
Padre
Fork () - 2
Proceso Padre Proceso Hijo
# include main() { int pid; /************************************************ creación de un proceso concurrente con el creador *************************************************/ pid=forck (); if ((pid == -1) { printf ("error en creacion de proceso hijo\n"); exit(1); } else if ( pid == 0) /* proceso hijo */ { printf ("Proceso hijo1\n"); fflush(stdout); exit (0); /* terminacion con codigo 0 */ } else /* proceso padre */ { printf ("Proceso padre\n"); fflush(stdout); wait (0); } }
# include main() { int pid; /************************************************ creación de un proceso concurrente con el creador *************************************************/ pid=forck (); if ((pid == -1) { printf ("error en creacion deproceso hijo\n"); exit(1); } else if ( pid == 0) /* proceso hijo */ { printf ("Proceso hijo 1\n"); fflush(stdout); exit (0); /* terminacion con codigo 0 */ } else /* proceso padre */ { printf ("Proceso padre\n"); fflush(stdout); wait (0); } }
Padre
Hijo
Suponemos que se pudo crear el proceso hijo (fork devuelve números no negativos) Ambos procesos continúan ejecutando la siguiente sentenciaal fork().
Fork () - 3
Proceso Padre Proceso Hijo
# include main() { int pid; /************************************************ creación de un proceso concurrente con el creador *************************************************/ pid=forck (); if ((pid == -1) { printf ("error en creacion de proceso hijo\n"); exit(1); } else if ( pid == 0) /* proceso hijo */ { printf ("Proceso hijo 1\n");fflush(stdout); exit (0); /* terminacion con codigo 0 */ } else /* proceso padre */ { printf ("Proceso padre\n"); fflush(stdout); wait (0); } }
# include main() { int pid; /************************************************ creación de un proceso concurrente con el creador *************************************************/ pid=forck (); if ((pid == -1) { printf ("error en creacion de proceso...
Regístrate para leer el documento completo.