Skip to content

ascatena/Linux-IPC-Concurrency-C

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Linux-IPC-Concurrency-C

Comunicación entre Procesos y Concurrencia en Sistemas POSIX (C)

C Linux GNU Bash

Autor: Adriano Scatena


Índice

  1. Descripción General

  2. process_manager_signals.c
    2.1. Objetivo
    2.2. Arquitectura del Diseño
    2.3. Modelo de Ejecución
    2.4. Comportamiento por Señal
    2.5. Estructura de Datos Utilizada
    2.6. Aspectos Técnicos Relevantes
    2.7. Compilación

  3. shared_memory_ipc.c
    3.1. Objetivo
    3.2. Modelo General
    3.3. Componentes IPC Utilizados
    3.4. Cifrado Implementado
    3.5. Control de Estado de Proceso
    3.6. Terminación Coordinada
    3.7. Compilación y Ejecución

  4. Decisiones de Diseño Destacadas

  5. Tecnologías y Conceptos


Descripción General

Este repositorio implementa mecanismos avanzados de Comunicación entre Procesos (IPC) y control de concurrencia en sistemas GNU/Linux bajo estándar POSIX, utilizando lenguaje C a nivel de system calls.

El proyecto está compuesto por dos programas independientes:

  • process_manager_signals.c
  • shared_memory_ipc.c

Ambos exploran problemas clásicos de Sistemas Operativos:

  • Creación y jerarquía de procesos (fork)
  • Reemplazo de imagen de proceso (exec)
  • Manejo asincrónico de señales
  • Sincronización entre procesos sin memoria compartida implícita
  • Uso explícito de memoria compartida System V
  • Comunicación mediante FIFOs
  • Terminación coordinada y liberación segura de recursos
  • Diseño robusto frente a condiciones de carrera

El enfoque del repositorio es práctico y técnico, orientado a demostrar comprensión profunda del modelo de ejecución de procesos en Linux.


1. process_manager_signals.c

Gestión Dinámica de Procesos mediante Señales

Objetivo

Diseñar un proceso padre que responda dinámicamente a señales externas creando y gestionando procesos hijos con comportamientos diferenciados.


Arquitectura del Diseño

El programa implementa:

  • Manejadores de señales livianos que solo modifican flags volatile
  • Separación estricta entre:
    • Código del manejador
    • Lógica principal
  • Uso de pause() para bloqueo eficiente
  • Lista enlazada dinámica tipo LIFO para registrar PIDs

Se evita ejecutar lógica compleja dentro de los handlers, reduciendo comportamiento indefinido.


Modelo de Ejecución

El proceso padre:

  • Registra manejadores para SIGUSR1, SIGUSR2 y SIGTERM
  • Permanece bloqueado esperando señales
  • Reacciona según la señal recibida

Comportamiento por Señal

SIGUSR1

  • Ejecuta fork()
  • Registra el PID en una lista enlazada dinámica
  • El hijo:
    • Configura SIGALRM
    • Imprime su PID y el del padre cada 5 segundos
    • Utiliza alarm(5) para temporización periódica

Se implementa una bandera _5seg para desacoplar la señal de la lógica de impresión.


SIGUSR2

  • Ejecuta fork()
  • El hijo reemplaza su imagen con:
execl("/bin/ls", "ls", NULL);

Esto demuestra uso correcto de exec y reemplazo total del espacio de memoria del proceso.


SIGTERM

  • Recorre la lista dinámica de hijos creados por SIGUSR1
  • Envía SIGTERM a cada uno con intervalo de 1 segundo
  • Libera memoria dinámica
  • Finaliza ordenadamente

Estructura de Datos Utilizada

typedef struct nodo {
    pid_t pid;
    struct nodo *siguiente;
} nodo;

Permite:

  • Registro incremental
  • Eliminación ordenada
  • Gestión explícita de memoria (malloc / free)

Aspectos Técnicos Relevantes

  • Uso de volatile bool para flags de señal
  • Separación de handlers y lógica
  • Uso correcto de SIG_DFL en procesos hijos
  • Gestión manual de memoria dinámica
  • Prevención de ejecución simultánea indebida

Compilación

gcc process_manager_signals.c -o process_manager

2. shared_memory_ipc.c

Sincronización Bidireccional con Memoria Compartida y Señales

Objetivo

Implementar comunicación coordinada entre dos procesos independientes (A y B) utilizando:

  • Memoria compartida System V
  • Pipes nombrados (FIFO)
  • Señales POSIX
  • Cifrado modular aplicado a los datos

Modelo General

El sistema implementa un protocolo de alternancia estricta:

  • A escribe posiciones 0–9
  • B escribe posiciones 10–19
  • Ninguno puede escribir hasta que el otro haya leído
  • Escritura: 1 valor por segundo
  • Lectura: sincronizada por señales
  • Finalización coordinada mediante SIGTERM

Componentes IPC Utilizados

1. Memoria Compartida (System V)

Funciones utilizadas:

  • ftok
  • shmget
  • shmat
  • shmdt
  • shmctl

Estructura:

typedef struct {
    int datos[20];
} shared_memory;

La memoria solo contiene datos, nunca flags de control.


2. FIFOs (Named Pipes)

  • pipe_fifoA
  • pipe_fifoB

Se utilizan exclusivamente para intercambio inicial de PIDs.

Se implementa manejo robusto ante:

  • EEXIST
  • ENXIO
  • Apertura no bloqueante

3. Señales como Mecanismo de Sincronización

Se emplean:

  • SIGUSR1
  • SIGUSR2
  • SIGTERM

Las señales activan flags volatile sig_atomic_t, garantizando:

  • Seguridad en acceso concurrente
  • No ejecución de lógica compleja dentro del handler
  • Separación entre señal y decisión

Cifrado Implementado

Función pública:

[ f(x) = (4x + 5) \mod 27 ]

Función inversa:

[ f^{-1}(x) = (7x + 19) \mod 27 ]

Cada proceso:

  • Cifra antes de escribir
  • Descifra al leer

Esto introduce una capa adicional de transformación de datos sobre IPC.


Control de Estado de Proceso

Se implementa:

kill(pid, 0)

Para verificar existencia del proceso remoto antes de finalizar.

Esto evita zombies y asegura terminación limpia.


Terminación Coordinada

Proceso A:

  • Envía SIGTERM a B
  • Espera confirmación de muerte
  • Libera memoria compartida
  • Elimina FIFOs

Proceso B:

  • Se desasocia
  • Elimina su FIFO
  • Finaliza

Se garantiza:

  • No fuga de memoria
  • No recursos IPC huérfanos
  • No procesos zombies

Compilación

gcc shared_memory_ipc.c -o shared_memory_ipc -lrt

Ejecución

Terminal 1:

./shared_memory_ipc A

Terminal 2:

./shared_memory_ipc B

Finalización:

kill -SIGTERM <PID_de_A>

Decisiones de Diseño Destacadas

  • Uso de volatile sig_atomic_t en vez de tipos primitivos simples
  • Separación estricta entre datos y control
  • No utilización de busy waiting
  • Uso de pause() para espera eficiente
  • Manejo explícito de errores (errno)
  • Liberación manual de recursos IPC
  • Implementación de protocolo de alternancia sin mutexes

Tecnologías y Conceptos

  • C (GNU)
  • POSIX Signals
  • System V Shared Memory
  • FIFOs
  • fork / exec
  • alarm
  • kill
  • IPC
  • Concurrencia sin threads
  • Sincronización asincrónica

Este repositorio demuestra dominio en programación de sistemas, diseño concurrente y gestión explícita de recursos a bajo nivel en entornos Linux.

About

Implementación de mecanismos de comunicación entre procesos (IPC) en entornos POSIX utilizando lenguaje C. El proyecto incluye gestión avanzada de señales, sincronización mediante memoria compartida y pipes nombrados (FIFOs), control dinámico de procesos (fork/exec) y algoritmos de cifrado modular para la transmisión segura de datos.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages