Sistemas operativos modernos

#define TRU E 1 while (TRUE) { /* repite indefinidamente */ type_prompt( ); /’ muestra el indicador de comandos en pantalla */ read_command(command, parameters); /* lee entradas de la terminal */ if (fork( ) != 0) { r produce el proceso hijo V /* Código del padre. */ waitpid(-1, &status, 0); /* espera a que el hijo termine V } else { r Código del hijo. */ execve(command, parameters, 0); /*ejecuta el comando V } Figura 1-19. Un shell reducido. En todo este libro suponemos que TRUE se define como 1. Consideremos el caso de un comando como cp arch1 arch2 empleado para copiar archl en archl. Una vez que el shell se ha bifurcado, el proceso hijo lo­ caliza y ejecuta el archivo cp y le pasa los nombres de los archivos de origen y destino. El programa principal de cp (y el de la mayoría de los programas en C) contiene la decla­ ración main(argc, argv, envp) donde argc es el número de elementos que debe haber en 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 instrucciones. En nuestro ejemplo, argv[0] apun­ taría a la cadena “cp”, argv[\] apuntaría a la cadena “archl” y argv[2\ apuntaría a la cadena “arch2”. El tercer parámetro de main, envp, es un apuntador al entorno: un arreglo de cadenas que contienen asignaciones de la forma nombre = valor, empleadas para pasar información al pro­ grama, como el tipo de terminal y el directorio base. En la figura 1-19 no se pasa un entorno al hijo, por lo que el tercer parámetro de execve es un cero. Si al lector le parece que exec es complicada, no debe desesperarse; se trata de la más compleja (desde el punto de vista semántico) de todas las llamadas POSIX al sistema. Todas las demás son mucho más sencillas. Como ejemplo de llamada sencilla, consideremos exit, misma que deben usar los procesos cuando terminan su ejecución. Sólo hay un parámetro, el estado de terminación (Oa 255), que se devuelve al padre mediante statloc en la llamada al sis­ tema waitpid.

RkJQdWJsaXNoZXIy MjI4NDcx