Sistemas operativos modernos

Consideremos el caso de un comando tecleado en el shell, como Cp archivol archivo2 que sirve para copiar archivol en archivol. Después de que el shell se bifurca, el hijo localiza y ejecuta el archivo cp y le pasa información acerca de los archivos a copiar. El programa principal de cp (y de muchos otros programas) contiene la declaración de fun­ ción main(argc, argv, entorno) donde argc es el número de elementos de que se compone la línea de comandos, incluido el nombre del programa. En el ejemplo anterior, argc es 3. El segundo parámetro, argv, es un apuntador a un arreglo. El elemento i de ese arreglo es un apuntador a la í-ésima cadena de la línea de comandos. En nuestro ejemplo, argv[0] apunta a la cadena “cp”, a^^v[l] apunta a la cadena de ocho caracteres “archivol” y argv[2] apunta a la ca­ dena “archivo 2 ”. El tercer parámetro de main, entorno, es un apuntador al entorno, un arreglo de cadenas que contienen asignaciones de la forma nombre = valor y que sirve para pasar a un programa información como el tipo de terminal y el nombre del directorio base. En la figura 10-7 no se pasa ningún entorno al hijo, por lo que el tercer parámetro de execve es cero en ese caso. Si exec le parece complicado, no debe desesperarse; es la llamada más compleja al siste­ ma. Las demás son mucho más sencillas. Un ejemplo de llamada sencilla es exit (salir), que deben usar los procesos al terminar de ejecutarse. Sólo tiene un parámetro, el estado al salir (O a 255), que se devuelve al padre en la variable status de la llamada al sistema waitpid. El by­ te de orden bajo de status confiene el estado de terminación, que es O si el proceso terminó de modo normal; los demás valores son diversas condiciones de error. El byte de orden alto con­ tiene el estado del hijo al salir (0-255), que se especificó en la llamada a exit del hijo. Por ejem­ plo, si un proceso padre ejecuta la instrucción n= waitpid(-1, &status, 0); se suspenderá hasta que algún proceso hijo termine. Si el hijo termina con, digamos, 4 como parámetro de exit, se activará al padre habiendo asignado a n el PID del hijo, y a status el va­ lor 0x0400 (Ox como prefijo indica hexadecimal en C). El byte de orden bajo de status tiene que ver con las señales; el siguiente es el valor que el hijo devolvió en su llamada a exit. Si un proceso termina con exit y su padre no ha comenzado a esperarlo, el proceso entra­ rá en una especie de animación suspendida llamada estado zombí. Cuando por fin el padre espere al proceso hijo, éste terminará. Varias llamadas al sistema tienen que ver con señales, y se usan de diversas maneras. Por ejemplo, si un usuario ordena sin querer a un editor de texto que muestre todo el contenido de un archivo muy largo y luego se da cuenta de su error, necesita alguna forma de interrumpirlo. La opción normal es que el usuario oprima alguna tecla especial (por ejemplo, SUPR o CTRL+C), que envía una señal al editor El editor atrapa la señal y defiene la exhibición.

RkJQdWJsaXNoZXIy MjI4NDcx