Universidad de Costa Rica | Escuela de Ingeniería Eléctrica IE-0117 Programación Bajo Plataformas Abiertas Manejo de procesos en GNU/Linux Una de las características de los sistemas operativos tipo UNIX es que son multiproceso. Esto signica que pueden ejecutar varios procesos de forma «paralela». Este paralelismo es aparente, puesto que un el procesador de una computadora solo puede ejecutar una operación a la vez. En realidad, el núcleo del sistema operativo, a través de un componente llamado planificador (scheduler) divide el tiempo del procesador entre todos los procesos activos. Los procesadores son tan rápidos que el usuario no nota estas transiciones y percibe que todas las aplicaciones se ejecutan de forma consecutiva. En los sistemas tipo UNIX, cada proceso tiene un identificador numérico conocido como PID (Process ID). 1. Listado de procesos Los procesos pueden listarse con el comando ps. De forma predeterminada ps sólo lista los procesos de la terminal actual, sin embargo pueden agregarse opciones para obtener más información. Por ejemplo, ps aux muestra todos los procesos del sistema, con sus respectivos usuarios. Otros comandos que permiten ver los procesos son pstree y top. Otro comando útil es pgrep que puede usarse para buscar el PID de un proceso a partir de su nombre. 2. Múltiples procesos en una sola terminal Cuando se trabaja en la interfaz gráfica es natural ejecutar varios programas a la vez. Pareciera que en una terminal esto no es posible, sin embargo, GNU/Linux y otros sistemas operativos tipo UNIX brindan las herramientas necesarias para lograr esto. Los procesos que se ejecutan en el sistema pueden clasificarse en dos grupos. Los procesos que corren en el foreground y los que corren en el background: Procesos que corren en el foreground: procesos con los que el usuario interactúa. Un proceso en el foreground bloquea la terminal, evitando que el usuario pueda ejecutar nuevos procesos hasta que el proceso actual finalice. Procesos que corren en el background: proceso que se ejecuta sin la intervención del usuario. A pesar de que están siendo ejecutados, la línea de comandos está libre para utilizar nuevos comandos. Generalmente los procesos que se corren en el background no generan ninguna salida, o bien su salida es guardada en archivos y no es impresa en la terminal. Es posible iniciar un proceso en el background agregando un & (ampersand) al final de la línea de comandos: $ comando & Además, la mayoría de los comandos pueden ser detenidos y enviados al background presionando la combinación de teclas Ctrl-z. Nótese que esto también detiene el programa y no sólo lo envía al background. Es posible usar el comando bg para reanudar un proceso detenido en el background, o bien fg para traerlo de vuelta al foreground. Sí hay varios procesos en el background es necesario indicar cual es el proceso usando el identificador de trabajo (que es distinto del PID). Esta información puede obtenerse con el comando jobs. 1 IE-0117 Programación Bajo Plataformas Abiertas 3. Manejo de procesos en GNU/Linux Señales Las señales permiten que un proceso envíe un mensaje a otro. Existen 32 señales definidas en el estándar POSIX (64 tomando en cuenta señales especiales para procesamiento en tiempo real). Algunas de ellas tienen un significado definido, como la señal INT (2) que es la señal de interrupción que se envía cuando se presiona Ctrl-c o la señal KILL (9), que finaliza un proceso. Otras señales están disponibles para el uso que especifiquen los programadores. Es posible enviar señales desde la terminal usando el comando kill. Este comando toma como argumento la señal que se desea enviar y el PID del proceso. Por ejemplo: $ kill -KILL 34214 envía la señal KILL (9) al proceso 34214. También puede utilizarse el número de la señal, si existe: $ kill -2 43432 envía la señal INT (2) al proceso 43432. Existe también el comando killall, que toma como argumento el nombre del proceso. Este comando debe usarse con cuidado, pues es posible que hayan varios procesos con el mismo nombre. 2