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;
}