LinuxParty
En esta entrega de la serie “Hablando UNIX”, nos adentramos en el núcleo de cómo UNIX maneja la ejecución de programas. Aprenderás a clonar procesos con fork()
, reemplazarlos con execve()
, y cómo gestionarlos con comandos como ps
, kill
o wait
. Verás ejemplos prácticos en C y shell script, y entenderás cómo funciona un proceso UNIX internamente.
📌 ¿Qué es un proceso?
Un proceso es una instancia de un programa en ejecución. Está compuesto por:
- Código ejecutable
- Variables (segmento de datos)
- Descriptores de archivo
- Estado de ejecución (PC, registros, etc.)
Puedes ver los procesos actuales con:
ps -ef
🧬 fork()
: clonar un proceso
fork()
es una llamada del sistema que crea un nuevo proceso idéntico al actual. Ambos procesos ejecutan el mismo código, pero:
- En el padre,
fork()
devuelve el PID del hijo. - En el hijo,
fork()
devuelve 0.
📄 Ejemplo en C:
#include <unistd.h> #include <stdio.h> int main() { pid_t pid = fork(); if (pid == 0) { printf("👶 Soy el proceso hijo (PID %d)\n", getpid()); } else if (pid > 0) { printf("👨 Soy el proceso padre (PID %d), hijo = %d\n", getpid(), pid); } else { perror("fork falló"); } return 0; }
🧠 ¿Por qué usar execve()
tras fork()
?
El proceso hijo creado por fork()
sigue ejecutando el mismo código que el padre. Para que el hijo ejecute otro programa, usamos execve()
:
execve("/usr/bin/ls", argv, envp);
Esto reemplaza completamente la imagen del proceso hijo con un nuevo ejecutable.
🤖 Ejemplo completo en C: fork()
+ execve()
#include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[], char *envp[]) { pid_t pid = fork(); if (pid == 0) { printf("🧒 Hijo ejecutando 'ls'...\n"); execve("/bin/ls", (char *[]){"ls", "-l", NULL}, envp); perror("execve"); exit(1); } else if (pid > 0) { printf("👨 Padre esperando a su hijo (PID %d)\n", pid); wait(NULL); } else { perror("fork"); } return 0; }
📜 Automatización con Bash
🔧 Script en shell para ejecutar múltiples hijos:
#!/bin/bash echo "Creando 3 procesos hijos..." for i in {1..3}; do ( echo "👶 Hijo $$ está ejecutando 'date'" date sleep 1 echo "👶 Hijo $$ finaliza" ) & done wait echo "Todos los hijos han terminado."
Guárdalo como multi_fork.sh
, hazlo ejecutable (chmod +x multi_fork.sh
) y ejecútalo.
🖼️ Ilustración ASCII de un proceso UNIX
Proceso padre ┌───────────────┐ │ Shell/bash │ └──────┬────────┘ │ fork() ▼ ┌───────────────┐ │ Proceso hijo │ └──────┬────────┘ │ execve() ▼ ┌──────────────────┐ │ /usr/bin/program │ └──────────────────┘
🧟 Estados de proceso y señales
Estado | Significado |
---|---|
R | Ejecutando o preparado |
S | Dormido, espera de evento |
Z | Zombie, terminó sin recolectar |
T | Parado (pausa, señal STOP) |
🔫 Para matar un proceso:
kill -9 <PID>
🔍 Ver todos los procesos:
ps -eo pid,ppid,comm,state
📌 Ver árbol de procesos:
pstree -p
📈 Diagrama ASCII de múltiples forks
Padre (PID 1000) │ ┌───────┼────────┐ │ │ │ Hijo1 Hijo2 Hijo3 (PID 1001)(1002) (1003)
📘 Conclusión y recursos
✔️ Lo aprendido:
fork()
duplica un proceso.execve()
lo reemplaza con un nuevo ejecutable.- Se pueden crear árboles de procesos.
- Con comandos básicos (
ps
,kill
,wait
,pstree
) se puede gestionar eficazmente la ejecución.
📚 Recursos recomendados:
man 2 fork
man 2 execve
man wait
- Libro: Advanced Programming in the UNIX Environment – W. Richard Stevens

-
Google
- Diccionario de Google
- Google Desktop Ahora en Linux.
- Repositorios de Google para Linux.
- ¿Alcanzará Google una cuota de mercado del 90% en diez años?
- La DGT utilizará Google Maps para informar desde su web
- Google entra en el mundo de las web sociales chinas con Tianya
- El Cielo, es de Google!
- Usar Repositorios Google Linux en Debian.
- Google obstaculiza la licencia Open Source de Microsoft
- Convertir .flv (Google Videos) a .mpg usando el ffmpeg
- Google Traerá Nuevas Aplicaciones para Linux.
- GPhone: los rumores se confirman