LinuxParty

Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

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

No estás registrado para postear comentarios



Redes:



   

 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Filtro por Categorías