En una empresa de desarrollo de software de sistema se está realizando un proyecto de personalización de un sistema operativo Linux (Ubuntu). Se ha propuesto incluir nuevos comandos en el intérprete de línea de comandos. A usted se le asigna la tarea de programar un nuevo comando llamado psinfo
, que permita obtener información importante acerca de un determinado proceso del sistema operativo.
En esta versión del laboratorio, se autoriza el uso de herramientas generativas de código (por ejemplo ChatGPT, GitHub Copilot, etc.), con la condición de que cada estudiante documente claramente:
- Las partes del código que fueron generadas por la herramienta.
- La forma como se ajustaron o corrigieron las respuestas generadas.
- El aprendizaje o hallazgos que surgieron al usar estas herramientas.
El objetivo es aprender tanto el uso de C y de los conceptos de procesos en Linux, como la correcta integración y validación de lo que producen las herramientas de IA.
Como se ha mencionado en la teoría, un proceso en Unix/Linux es una instancia en ejecución de un programa, con datos asociados (archivos abiertos, memoria asignada, prioridad, estado, etc.). En Ubuntu, se pueden obtener datos de los procesos en ejecución mediante:
- El System Monitor (interfaz gráfica).
- La consola, utilizando herramientas como
ps
,top
ojobs
.
Los comandos más utilizados para listar y monitorear procesos desde la consola incluyen:
ps
: Lista procesos en ejecución.ps -ux
: lista los procesos del usuario actual.ps -aux
: lista todos los procesos del sistema.
top
: Muestra procesos más activos, ordenados por uso de CPU.jobs
: Muestra procesos en background en el shell actual.
- Ejecute
ps
y analice la salida. - Ejecute
jobs
. ¿Qué muestra? - Lance un proceso en background (por ejemplo
gedit &
) y observe suPID
. - Ejecute
ps l
y revise campos comoPID
,VSZ
,RSS
,STAT
. - Compare la información con la que brinda el System Monitor.
- Cierre
gedit
y observe cómo se ve enps
y en la terminal.
En la carpeta /proc
, el kernel expone información de los procesos. Cada proceso se representa como un subdirectorio /proc/[pid]/ con archivos como status, stat, cmdline, etc.
- Explore
/proc
, verifique qué significan los subdirectorios numéricos (PID
). - Revise los archivos
status
ystat
del procesogedit
. Compare la información y analice cuál es más práctico de leer para esta práctica.
Deberá desarrollar un programa en C, con el objetivo de replicar (de forma simplificada) algunas funciones de comandos de monitoreo de procesos. Usará el pseudo-sistema de archivos /proc
para obtener información.
El desarrollo se realizará por etapas, cada una generando una versión funcional. Al final, su programa debe:
- Recibir PIDs como parámetros.
- Leer la información de cada PID desde
/proc/[pid]/status
(u otros archivos en/proc
que sean pertinentes). - Mostrar la información requerida por pantalla y, según la etapa, también generar reportes a archivos.
Desarrolle un programa básico psinfo
que:
- Reciba un solo identificador de proceso (
PID
) como argumento en línea de comandos. - Muestre en pantalla:
- Nombre del proceso (
Name
). - Estado del proceso (
State
). - Tamaño total de la imagen de memoria.
- Tamaño de la sección de memoria TEXT (
VmExe
). - Tamaño de la sección de memoria DATA (
VmData
). - Tamaño de la sección de memoria STACK (
VmStk
). - Número de cambios de contexto realizados:
- Voluntarios (
voluntary_ctxt_switches
) - No voluntarios (
nonvoluntary_ctxt_switches
)
- Voluntarios (
- Nombre del proceso (
A continuación se muestra un ejemplo de uso:
$ ./psinfo 10898
Nombre del proceso: gedit
Estado: S (sleeping)
Tamaño total de la imagen de memoria: 715000 KB
Tamaño de la memoria TEXT: 10000 KB
Tamaño de la memoria DATA: 24200 KB
Tamaño de la memoria STACK: 21000 KB
Número de cambios de contexto (voluntarios - no voluntarios): 17536 - 189
Agregue la opción -l
(lista múltiple). Si el usuario ingresa varios PIDs
, por ejemplo:
$ psinfo -l 10898 1342 2341
El programa debera cumplir con los siguientes requisitos:
- Almacenar la información de cada PID en estructuras en memoria, antes de reportar el resultado en pantalla.
- Reportar en pantalla los datos de cada uno, por ejemplo:
A continuación se muestra una posible plantilla para la salida asociada al comando anterior:
-- Información recolectada!!!
Pid: 10898
Nombre del proceso: gedit
...
Pid: 1342
Nombre del proceso: chrome
...
Pid: 2341
Nombre del proceso: bash
...
Implemente la opción -r
(reporte a archivo). De forma similar a la opción -l
, el programa debe:
- Tomar varios PIDs.
- Leer la información de cada proceso.
- Generar un archivo de salida llamado:
psinfo-report-[pid1]-[pid2]-...[pidN].info
que contenga la misma información.
A continuación se muestra un ejemplo de uso para ilustrar el resultado de la implementación anteriormente descrita:
$ psinfo -r 10898 1342
Archivo de salida generado: psinfo-report-10898-1342.info
El programa debe ser capaz de gestionar los siguientes casos de uso incorrecto:
- Parámetros inválidos o ausencia de PIDs.
- Procesos inexistentes.
- Error en la lectura de archivos de
/proc
.
Si detecta un error, el programa debe:
- Imprimir un mensaje indicando el problema.
- Mostrar un resumen de la sintaxis correcta (por ejemplo,
Uso: psinfo [-l|-r] <listado PIDs>
). - Finalizar con un código de error distinto del de ejecución normal (por ejemplo,
return 1;
).
- Desarrollo por etapas: Mantenga siempre una versión funcional (use control de versiones, como
git
). - Buenas prácticas de programación:
- Código modular (multiarchivo).
- Funciones claras.
- Documentación apropiada (comentarios).
- Lectura y validación de la información que genera
/proc/[pid]
:- Tenga en cuenta que algunos campos podrían no existir si el proceso ya terminó.
- Sea robusto ante la posibilidad de que un archivo no se pueda abrir.
- Eficiencia: Aunque no es el eje central de la práctica, procure un manejo adecuado de memoria (uso de structs y punteros cuando sea necesario).
Para fomentar la comprensión y evitar un uso superficial de herramientas de IA, deberá incluir en la entrega lo siguiente:
- Reporte de uso de IA generativa
- Explique qué prompts o indicaciones usó con la(s) herramienta(s) (por ejemplo, ChatGPT, GitHub Copilot).
- Mencione qué porciones de código provinieron de la IA.
- Describa qué modificaciones realizó tras analizar y probar dicho código.
- Incluya cualquier corrección de errores, advertencias o inconsistencias que haya surgido en el proceso.
- Reflexión técnica
- Describa por qué usó la IA en determinadas partes (por ejemplo, generación de una función de lectura de archivos, formateo de strings, etc.).
- Explique qué aprendió al comparar el código generado con la documentación oficial o con sus propios conocimientos.
- Pruebas y debugging
- Documente al menos tres casos de prueba:
PID
válido de un proceso en ejecución.PID
inexistente o muerto.- Uso de la opción
-l
o-r
con múltiplesPIDs
.
- Incluya capturas o transcripciones de la consola donde se vea el comportamiento de su programa.
- Si surgieron errores (por ejemplo, segmentation fault, datos incorrectos), explique el proceso de debugging y la corrección realizada.
- Documente al menos tres casos de prueba:
- Sección "a mano"
- Al menos una de las secciones del código (por ejemplo, la que realiza la lectura detallada de
/proc/[pid]/status
) deberá ser desarrollada sin asistencia de la IA. - Explique en el reporte cómo comprobó y validó esa porción de código.
- Al menos una de las secciones del código (por ejemplo, la que realiza la lectura detallada de
- Evite la dependencia ciega en la herramienta. Siempre revise la veracidad y pertinencia del código generado.
- Cite adecuadamente cualquier fragmento de ejemplo o referencia que use.
- Código fuente (multiarchivo) de
psinfo
: Archivos de codigo fuente yMakefile
(u otro mecanismo de compilación) que permita compilar el proyecto con un simple comando:make
- Informe escrito: que debe incluir:
- Estructura general del programa (funciones y archivos).
- Reporte de uso de IA (prompts, porciones de código generadas, modificaciones realizadas).
- Reflexión técnica (lecciones aprendidas, comparaciones, etc.).
- Pruebas y debugging (casos de prueba, logs de corrección).
- Conclusiones y posibles mejoras.
- Rúbrica de evaluación:
- Funcionalidad (30%): El programa compila y corre adecuadamente, respondiendo a las etapas requeridas.
- Correctitud técnica (20%): Manejo correcto de archivos y estructuras en C, control de errores, lectura de
/proc
. - Reporte de uso de IA (20%): Claridad en la explicación de cómo se usó la herramienta generativa. Diferenciación entre código generado y propio.
- Reflexión y debugging (20%): Calidad de la documentación de errores, pruebas y soluciones.
- Buenas prácticas y presentación (10%): Estructura modular, nomenclatura, comentarios, formato de entrega.
- Un ZIP o carpeta con:
- Código fuente (
*.c
,*.h
). Makefile
.- Informe (
.pdf
).
- Código fuente (
- Opcional: Repositorio en
GitHub/Bitbucket
con historial de commits (si usa control de versiones).
- La fecha límite de entrega y los canales de consulta (foros, Moodle, etc.) se encuentran en la plataforma oficial del curso.
- Cualquier duda adicional, contacte al equipo docente en horas de consulta o vía el foro del curso.
Este laboratorio tiene como fin consolidar los conceptos de manejo de procesos en Linux, aprender y ejercitar la programación en C, y desarrollar competencias en la utilización crítica y efectiva de herramientas de IA generativa. ¡Éxitos en el desarrollo!