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 forkman 2 execveman wait- Libro: Advanced Programming in the UNIX Environment – W. Richard Stevens

-
Linux
- 🧰 Cómo reparar el error “Transport endpoint is not connected” en Linux (y por qué ocurre)
- Can’t read superblock: recuperando una partición con el primer superbloque dañado con Linux
- Comprobar el estado de salud del disco duro con Smartmontools, smartctl buscando sectores ilegibles
- 7 características y herramientas útiles de seguridad de Linux para principiantes
- Ejecutar Aplicaciones Gráficas Remotas en Local: Guía Completa en Linux
- Las 8 mejores herramientas para acceder a Linux por remoto
- Clientes de acceso remoto, desde y para el escritorio Linux
- ¡Histórico! Linux Supera el 6% de Cuota de Mercado en Escritorios: ¿El Año de Linux Ha Llegado?
- Woof: Compartir archivos/ficheros fácilmente en su LAN o red local, sin Samba, entre Linux, Mac, Windows, Android e iPhone
- Compartir archivos en la red LAN, sin nada, todo con un simple script en Python
- Linux alcanza el 5% en el escritorio
- El Inadvertido Usuario de Linux.



