Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Funciones Útiles fork() Sistemas Operativos
Fork() – Caso base #include int main (void) { char c; printf("Ingrese un caracter\n"); c = getchar(); printf(Se ingresó: %c\n", c); } ¿Cómo puedo hacer si quiero que si el usuario no presiona ninguna tecla imprima en pantalla el mensaje nuevamente cada un segundo?
Fork() – Introducción Proceso ejecutando - Código (solo lectura) - Datos (memoria dinámica) - Stack (asignaciones estáticas) Identificador único (PID) Padre único Tres estructuras de memoria
Fork() – Introducción UID PID PPID C STIME TTY TIME CMD root :41 ? 00:00:00 init [2] :41 ? 00:00:00 /usr/sbin/exim4 -bd -q30m root :41 ? 00:00:00 /usr/sbin/inetd root :41 ? 00:00:00 /usr/sbin/sshd statd :41 ? 00:00:00 /sbin/rpc.statd daemon :41 ? 00:00:00 /usr/sbin/atd root :41 ? 00:00:00 /usr/sbin/cron root :41 tty1 00:00:00 /bin/login -- root :41 tty2 00:00:00 /sbin/getty tty2 root :41 tty3 00:00:00 /sbin/getty tty3 root :41 tty4 00:00:00 /sbin/getty tty4 root :41 tty5 00:00:00 /sbin/getty tty5 root :41 tty6 00:00:00 /sbin/getty tty6 root :42 tty1 00:00:00 -bash
Fork() – Introducción fork() Proceso en ejecución (PID x) Proceso Padre (PID x)Proceso Hijo (PID Y / PPID X)
Fork() – ¿Para Qué? Respuesta 1: Que los dos procesos sean iguales no quiere decir que tengan que seguir haciendo lo mismo. fork() Proceso en ejecución (PID x) Proceso en ejecución (PID x). ahora padre de Y Proceso en ejecución (PID Y). Hijo de X Leer_de_teclado() Escribir_en_archivo()
Fork() – ¿Para Qué? Respuesta 1: Que los dos procesos sean iguales no quiere decir que tengan que seguir haciendo lo mismo. int main() { int pid = 0, status = 0; pid = fork() if (pid == 0) { /* SOLO Proceso Hijo */ printf(``El PID de mi proceso padre es %d\n'', getppid()); exit(1); } else { /* SOLO Proceso Padre */ printf(``Mi PID es el %d y el de mi hijo es %d\n'', getpid(), pid); exit(0); }
Fork() – Notas - El proceso hijo comparte el entorno con el proceso padre. (Descriptores abiertos) -El proceso padre debe esperar la muerte del proceso hijo para que este no sea un zombie. funcion wait() - Todo proceso puede a su vez ser padre - Al morir un hijo se recibe la señal SIGCHLD - Al morir un padre deben morir sus hijos
Fork() – Exec*() La familia de funciones exec() reemplaza la imagen de proceso actual con la imagen de un proceso nuevo. fork() Proceso en ejecución (PID x) if (pid == 0) { // hijo execv(/bin/ls, NULL); // nunca se ejecuta exit(0); } else { // padre wait (pid); exit(0); }