0% encontró este documento útil (0 votos)
31 vistas14 páginas

Programas en C: Procesos y Señales

El documento presenta 3 ejercicios de programación en C relacionados con procesos y comunicación entre procesos en Linux. El primer ejercicio muestra el uso de señales SIGSTOP y SIGCONT para pausar y reanudar un proceso. El segundo resume el problema clásico de lectores y escritores y presenta una solución usando tuberías. El tercer ejercicio implementa la interacción entre un proceso padre e hijo donde el hijo calcula el módulo de un número y se lo devuelve al padre.

Cargado por

karla diaz
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
31 vistas14 páginas

Programas en C: Procesos y Señales

El documento presenta 3 ejercicios de programación en C relacionados con procesos y comunicación entre procesos en Linux. El primer ejercicio muestra el uso de señales SIGSTOP y SIGCONT para pausar y reanudar un proceso. El segundo resume el problema clásico de lectores y escritores y presenta una solución usando tuberías. El tercer ejercicio implementa la interacción entre un proceso padre e hijo donde el hijo calcula el módulo de un número y se lo devuelve al padre.

Cargado por

karla diaz
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Universidad Autónoma del Estado de México

Unidad Académica Profesional Tianguistenco

Ingeniería en software

Unidad de aprendizaje:
Administración de Bases de Datos

Profesor:
Julieta Garcilazo Reyes

Alumno:
Karla Diaz Arias
Abraham Vladimir García Lemus

Fecha de entrega: 19/octubre/2023


Objetivo
Instrucciones
Para todos los programas inserta los códigos en la asignación.
1.- Realiza un programa que se compile con gcc en el que un proceso imprima una
letra del alfabeto cada segundo hasta la impresión de 70 letras (se repite el
abecedario), el programa debe imprimir el PID del proceso y mostrar el uso de las
señales -SIGSTOP y SIGCONT para este programa. Inserta en en este punto la
impresión de la salida del uso de las señales.
2.-Haz un resumen del caso Lectores y escritores, realiza un programa que se
compile con gcc que resuelva el caso por medio de tuberías.
3.-Realiza un programa que se compile con gcc en donde se por medio de dos
procesos exista la
siguiente interacción:
- EL proceso padre pide un numero entero al usuario
- El proceso hijo debe obtener el modulo 5 del numero
- El proceso padre imprime en terminal el mensaje "El modulo 5 del numero es:" y
mostrar el resultado de aplicar el modulo
Desarrollo
1.- Realiza un programa que se compile con gcc en el que un proceso imprima una
letra del alfabeto cada segundo hasta la impresión de 70 letras (se repite el
abecedario), el programa debe imprimir el PID del proceso y mostrar el uso de las
señales -SIGSTOP y SIGCONT para este programa. Inserta en en este punto la
impresión de la salida del uso de las señales.
Evidencia:
Codigo:
#include <stdio.h> }
#include <stdlib.h> }
#include <unistd.h>
#include <signal.h> int main() {
#include <sys/types.h> signal(SIGSTOP, handler); // Manejar la
señal SIGSTOP
int count = 0; // Contador para las letras signal(SIGCONT, handler); // Manejar la
impresas señal SIGCONT
char letter = 'A'; // Letra inicial
while (count < 70) {
void handler(int signum) { printf("PID: %d - Letra: %c\n", getpid(),
if (signum == SIGSTOP) { letter);
printf("Proceso con PID %d pausado.\n", fflush(stdout);
getpid()); letter++;
pause(); count++;
} else if (signum == SIGCONT) {
printf("Proceso con PID %d if (letter > 'Z') {
reanudado.\n", getpid()); letter = 'A'; // Reiniciar el abecedario si
llegamos a 'Z'
}

sleep(1); // Esperar 1 segundo


}

return 0;
}
2.-Haz un resumen del caso Lectores y escritores, realiza un programa que se
compile con gcc que resuelva el caso por medio de tuberías.
Resumen:
El problema de “Lectores y Escritores” es un concepto básico en la programación
concurrente y la gestión de recursos compartidos en este caso usando 2 tuberías o
procesos los “lectores” y los “escritores”.
Los “lectores” pueden acceder al recurso compartido para leer datos sin afectar su
contenido, hay casos donde varios lectores pueden acceder a un recurso al mismo
tiempo.
Los “escritores” tienen la capacidad de modificar el recurso compartido. Sin
embargo, para mantener la integridad de los datos, se les permite acceder al recurso
exclusivamente, lo que significa que ningún otro lector o escritor pueden acceder al
recurso mientras in escritor lo este modificando.
Evidencia:
Codigo:
#include <stdio.h> close(pipe_fd[1]);
#include <stdlib.h> int data;
#include <unistd.h> read(pipe_fd[0], &data, sizeof(int));
#include <sys/wait.h> printf("Lector %d lee dato: %d\n", i + 1,
data);
#define MAX_TOTAL_PROCESSES 6 close(pipe_fd[0]);
#define READERS_COUNT 3 exit(0);
#define WRITERS_COUNT 2 }
}
int main() {
int pipe_fd[2]; for (int i = 0; i < WRITERS_COUNT; i++) {
pipe(pipe_fd); if (total_processes <
int total_processes = 0; MAX_TOTAL_PROCESSES && fork() == 0) {
total_processes++;
for (int i = 0; i < READERS_COUNT; i++) { close(pipe_fd[0]);
if (total_processes < int data = i + 1;
MAX_TOTAL_PROCESSES && fork() == 0) { printf("Escritor %d escribe dato: %d\n", i
total_processes++; + 1, data);
write(pipe_fd[1], &data, sizeof(int));
close(pipe_fd[1]);
exit(0);
}
}
3.-Realiza un programa que se compile con gcc en donde se por medio de dos
procesos exista la
siguiente interacción:
- EL proceso padre pide un numero entero al usuario
- El proceso hijo debe obtener el modulo 5 del numero
- El proceso padre imprime en terminal el mensaje "El modulo 5 del numero es:" y
mostrar el resultado de aplicar el modulo
Evidencia:
Codigo:
#include <stdio.h> close(pipe_fd[0]); // Cerrar el
#include <stdlib.h> extremo de lectura de la tubería en el
#include <unistd.h> proceso hijo
#include <sys/wait.h> exit(EXIT_SUCCESS);
} else {
int main() { // Proceso padre
int pipe_fd[2]; close(pipe_fd[0]); // Cerrar el
pid_t child_pid; extremo de lectura de la tubería en el
int number, modulo; proceso padre

// Crear la tubería // Pedir un número al usuario


if (pipe(pipe_fd) == -1) { printf("Ingrese un número entero:
perror("Error al crear la tubería"); ");
exit(EXIT_FAILURE); scanf("%d", &number);
}
// Escribir el número en el extremo
// Crear el proceso hijo de escritura de la tubería para el
child_pid = fork(); proceso hijo
write(pipe_fd[1], &number,
if (child_pid == -1) { sizeof(number));
perror("Error en la creación del
proceso hijo"); close(pipe_fd[1]); // Cerrar el
exit(EXIT_FAILURE); extremo de escritura de la tubería en el
} proceso padre

if (child_pid == 0) { // Esperar a que el proceso hijo


// Proceso hijo termine y recuperar el valor de su salida
close(pipe_fd[1]); // Cerrar el wait(NULL);
extremo de escritura de la tubería en el printf("\nEl módulo 5 del número
proceso hijo es: ");

// Leer el número desde el proceso // Leer el resultado desde la salida


padre estándar del proceso hijo
read(pipe_fd[0], &number, fflush(stdout);
sizeof(number)); fflush(stdin);
char resultado[10];
// Calcular el módulo 5 del número read(STDIN_FILENO, resultado,
modulo = number % 5; sizeof(resultado));
printf("%s", resultado);
// Enviar el resultado al proceso printf("\n");
padre a través de la salida estándar }
printf("%d", modulo);
return 0;
}

También podría gustarte