0% encontró este documento útil (0 votos)
25 vistas

Lab05 SO

El documento presenta el informe de laboratorio de una práctica sobre programación de colas de mensajes en C. Se detallan 5 ejercicios resueltos por el docente donde se crean programas para enviar y recibir mensajes utilizando colas de mensajes (msgget, msgsnd, msgrcv). Los programas creados son crea.c y leer.c para enviar y recibir, writer.c y reader.c para procesos de escritura y lectura, y masgq_send.c para enviar mensajes.
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
25 vistas

Lab05 SO

El documento presenta el informe de laboratorio de una práctica sobre programación de colas de mensajes en C. Se detallan 5 ejercicios resueltos por el docente donde se crean programas para enviar y recibir mensajes utilizando colas de mensajes (msgget, msgsnd, msgrcv). Los programas creados son crea.c y leer.c para enviar y recibir, writer.c y reader.c para procesos de escritura y lectura, y masgq_send.c para enviar mensajes.
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 27

UNIVERSIDAD NACIONAL DE SAN AGUSTIN

FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS


ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 1

INFORME DE LABORATORIO

INFORMACIÓN BÁSICA
ASIGNATURA: Laboratorio de Sistemas Operativos - C
TÍTULO DE LA
Programación de colas de mensajes
PRÁCTICA:
NÚMERO DE NRO.
05 AÑO LECTIVO: 2023 VI
PRÁCTICA: SEMESTRE:
FECHA DE HORA DE
09/10/2023
PRESENTACIÓN PRESENTACION
ALUMNO:
Llaique Chullunquia Angie Carolina NOTA:

DOCENTE(s):
Apaza Aceituno Roni Guillermo

SOLUCIÓN Y RESULTADOS
I. EJERCICIOS RESUELTOS POR EL DOCENTE

Ejercicio 1.
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo crea.c, compilelo:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct Msm {
long mtype;
int litros;
}Msm;
void enviarDatos(int msgid, long tipo){
struct Msm msm;
msm.mtype=tipo;
int i;
for (i = 0; i < 10; ++i) {
msm.litros = 10000*i;
msgsnd(msgid,&msm,sizeof(Msm)-sizeof(long),IPC_NOWAIT);
}
}
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 2

int main(int argc, const char *argv[])


{
//crear
key_t clave = ftok("/temp",40);
int msgid = msgget(clave,IPC_CREAT|0660);
//envia datos
enviarDatos(msgid, 1);
enviarDatos(msgid, 2);

//
char buffer[12];
scanf("%s",buffer);
//liberar
msgctl(msgid,IPC_RMID,NULL);
return 0;
}
Para compilar este programa utilizamos el siguiente comando en línea de comandos
$ gcc -w crear.c -o crear
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 3

Ejercicio 2.
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo leer.c, compilelo:
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdlib.h>
struct Msm {
long mtype;
int litros;
}Msm;
void leerDatos(int msgid,long tipo){
struct Msm msm;
int i;
for (i = 0; i < 10; ++i) {
msgrcv(msgid,&msm,sizeof(msm)-sizeof(long),tipo,0);
printf("tipo mensaje: [%ld] litros: [%d]\n",msm.mtype,msm.litros);
}
}
int main(int argc, const char *argv[])
{
//crear
key_t clave = ftok("/temp",40);
int msgid = msgget(clave,0660);
if(msgid<0){
perror("error en cola\n");exit(1);}
//envia datos
leerDatos(msgid, 2);
leerDatos(msgid, 1);

return 0;
}
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 4

Para compilar este programa utilizamos el siguiente comando en línea de comandos


$ gcc -w leer.c -o leer
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 5

Ejercicio 3.
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo writer.c, compílelo
// Programa en C para la cola de mensajes (proceso que escribe)
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX 10
// Estructura para la cola de mensajes
struct mesg_buffer {
long mesg_type;
char mesg_text[100];
} message;
int main()
{
key_t key;
int msgid;

// ftok genera la clave unica


key = ftok("progfile", 65);
// msgget crea una cola de mensajes
// y retorna el identificador
msgid = msgget(key, 0666 | IPC_CREAT);
message.mesg_type = 1;
printf("Escribe datos : ");
fgets(message.mesg_text,MAX,stdin);
// msgsnd envia mensajes
msgsnd(msgid, &message, sizeof(message), 0);
// display the message
printf("Los datos enviados son : %s \n", message.mesg_text);
return 0;
}
Para compilar este programa utilizamos el siguiente comando en línea de comandos
$ gcc writer.c -o writer
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 6

Ejercicio 4.
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo reader.c,
compílelo
// Programa en para la cola de mensajes (proceso lector)
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>

// Estructura para la cola de mensajes


struct mesg_buffer {
long mesg_type;
char mesg_text[100];
} message;

int main()
{
key_t key;
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 7

int msgid;

// ftok para generar la clave unica


key = ftok("progfile", 65);

// msgget para crear un cola de mensajes


// y retorna el identificador
msgid = msgget(key, 0666 | IPC_CREAT);

// msgrcv para recibir el mensaje


msgrcv(msgid, &message, sizeof(message), 1, 0);

// muestre el mensajedisplay the message


printf("Los datos recibidos son : %s \n",
message.mesg_text);

// Para destruir la cola de mensajes


msgctl(msgid, IPC_RMID, NULL);

return 0;
}
Para compilar este programa utilizamos el siguiente comando en línea de comandos
$ gcc reader.c -o reader
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 8

Ejercicio 5.
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo masgq_send.c,
compílelo
/* Nombre de archivo: msgq_send.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 9

#define PERMS 0644


struct my_msgbuf {
long mtype;
char mtext[200];
};
int main(void) {
struct my_msgbuf buf;
int msqid;
int len;
key_t key;
system("touch msgq.txt");
if ((key = ftok("msgq.txt", 'B')) == -1) {
perror("ftok");
exit(1);
}

if ((msqid = msgget(key, PERMS | IPC_CREAT)) == -1) {


perror("msgget");
exit(1);
}
printf("cola de mensajes: lista para enviar mensajes.\n");
printf("Ingrue la linea de texto, ^D ^para salir:\n");
buf.mtype = 1; /* No nos importa este caso en realidad */

while(fgets(buf.mtext, sizeof buf.mtext, stdin) != NULL) {


len = strlen(buf.mtext);
/*remueve newline al final si esta existe */
if (buf.mtext[len-1] == '\n') buf.mtext[len-1] = '\0';
if (msgsnd(msqid, &buf, len+1, 0) == -1) /* +1 for '\0' */
perror("msgsnd");
}
strcpy(buf.mtext, "end");
len = strlen(buf.mtext);
if (msgsnd(msqid, &buf, len+1, 0) == -1) /* +1 for '\0' */
perror("msgsnd");

if (msgctl(msqid, IPC_RMID, NULL) == -1) {


perror("msgctl");
exit(1);
}
printf("cola de mensajes hecha enviando mensajes.\n");
return 0;
}
Para compilar este programa utilizamos el siguiente comando en línea de comandos
$ gcc msgg_send.c -o msgg_send
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 10

Ejercicio 6.
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo masgq_recv.c,
compílelo
/* Nombre de archivo: msgq_recv.c */
#include <stdio.h>
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 11

#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define PERMS 0644
struct my_msgbuf {
long mtype;
char mtext[200];
};
int main(void) {
struct my_msgbuf buf;
int msqid;
int toend;
key_t key;

if ((key = ftok("msgq.txt", 'B')) == -1) {


perror("ftok");
exit(1);
}

if ((msqid = msgget(key, PERMS)) == -1) { /* conectando con la cola */


perror("msgget");
exit(1);
}
printf("cola de mensajes lista para recibir mensajes.\n");

for(;;) { /* normalmente la recepción nunca termina pero tiene una conclusion */


/* este programa finaliz con la cadena end */
if (msgrcv(msqid, &buf, sizeof(buf.mtext), 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("recvd: \"%s\"\n", buf.mtext);
toend = strcmp(buf.mtext,"end");
if (toend == 0)
break;
}
printf("cola de mensajes hecha recibiendo mensajes.\n");
system("rm msgq.txt");
return 0;
}
Para compilar este programa utilizamos el siguiente comando en línea de comandos
$ gcc msgq_recv.c -o msgq_recv
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 12

Ejercicio 7
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo elqueenvia.c,
compílelo
#include <stdio.h>
#include <stdlib.h>
#include <linux/ipc.h>
#include <linux/msg.h>
/* Redefiniendo la estructura msgbuf */
typedef struct mymsgbuf
{
long mtype;
int int_num;
float float_num;
char ch;
} mess_t;
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 13

int main()
{
int qid;
key_t msgkey;
mess_t sent;
mess_t received;
int length;
/* Inicialice la semilla del generador del numero pseudo random */
srand (time (0));
/* Longitud el mensaje */
length = sizeof(mess_t) - sizeof(long);
msgkey = ftok(".",'m');
/* Crea la cola */
qid = msgget(msgkey, IPC_CREAT | 0660);
printf("QID = %d\n", qid);
/* Construye el mensaje */
sent.mtype = 1;
sent.int_num = rand();
sent.float_num = (float)(rand())/3;
sent.ch = 'f';
/* Envia el mensaje */
msgsnd(qid, &sent, length, 0);
printf("MENSAJE ENVIADO...\n");
/* Recibe el mensaje */
msgrcv(qid, &received, length, sent.mtype, 0);
printf("MENSAJE RECIBIDO...\n");
/* Controla que lo que se ha recibido sea igual a lo que se ha enviado */
printf("Numero entero = %d (sent %d) -- ", received.int_num,
sent.int_num);
if(received.int_num == sent.int_num) printf(" OK\n");
else printf("ERROR\n");
printf("Numero flotante = %f (sent %f) -- ", received.float_num,
sent.float_num);
if(received.float_num == sent.float_num) printf(" OK\n");
else printf("ERROR\n");
printf("Char = %c (sent %c) -- ", received.ch, sent.ch);
if(received.ch == sent.ch) printf(" OK\n");
else printf("ERROR\n");
/* Estruye la cola */
msgctl(qid, IPC_RMID, 0);
}
Para compilar este programa utilizamos el siguiente comando en linea de comandos
$ gcc elqueenvia.c -o elqueenvia
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 14
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 15

Ejercicio 8.
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo elquerecibe.c,
compílelo
#include <stdio.h>
#include <stdlib.h>
#include <linux/ipc.h>
#include <linux/msg.h>
#include <sys/types.h>
/* Redefine la estructura del mensaje */
typedef struct mymsgbuf
{
long mtype;
int num;
} mess_t;

int main()
{
int qid;
key_t msgkey;
pid_t pid;
mess_t buf;
int length;
int cont;
length = sizeof(mess_t) - sizeof(long);
msgkey = ftok(".",'m');
qid = msgget(msgkey, IPC_CREAT | 0660);
if(!(pid = fork())){
printf("HIJO - QID = %d\n", qid);
srand (time (0));
for(cont = 0; cont < 10; cont++){
sleep (rand()%4);
buf.mtype = 1;
buf.num = rand()%100;
msgsnd(qid, &buf, length, 0);
printf("HIJO – NUMERO DE MENSAJE %d: %d\n", cont+1, buf.num);
}
return 0;
}
printf("PADRE - QID = %d\n", qid);
for(cont = 0; cont < 10; cont++){
sleep (rand()%4);
msgrcv(qid, &buf, length, 1, 0);
printf("PADRE – NUMERO DE MENSAJE %d: %d\n", cont+1, buf.num);
}
msgctl(qid, IPC_RMID, 0);
return 0;
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 16

}
Para compilar este programa utilizamos el siguiente comando en linea de comandos
$ gcc elquerecibe.c -o elquerecibe
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 17

Ejercicio 9
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo message_send.c,
compílelo
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#define MSGSZ 128
/*
* Declara la estructura del mensaje.
*/
typedef struct msgbuf {
long mtype;
char mtext[MSGSZ];
} message_buf;
main()
{
int msqid;
int msgflg = IPC_CREAT | 0666;
key_t key;
message_buf sbuf;
size_t buf_length;
/*
* Consigue el id de la cola de mensaje para el
* "name" 1234, el cual ha sido creado
* por el servidor.
*/
key = 1234;
(void) fprintf(stderr, "\nmsgget: llamando a msgget(%#lx,\
%#o)\n",
key, msgflg);
if ((msqid = msgget(key, msgflg )) < 0) {
perror("msgget");

exit(1);
}
else
(void) fprintf(stderr,"msgget: msgget exitoso: msqid = %d\n", msqid);
/*
* We'll send message type 1
*/

sbuf.mtype = 1;
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 18

(void) fprintf(stderr,"msgget: msgget exitoso: msqid = %d\n", msqid);

(void) strcpy(sbuf.mtext, "¿Conseguistes esto?");

(void) fprintf(stderr,"msgget: msgget exitoso: msqid = %d\n", msqid);

buf_length = strlen(sbuf.mtext) + 1 ;

/*
* Enviando mensaje.
*/
if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) {
printf ("%d, %d, %s, %d\n", msqid, sbuf.mtype, sbuf.mtext, buf_length);
perror("msgsnd");
exit(1);
}
else
printf("Message: \"%s\" Sent\n", sbuf.mtext);

exit(0);
}
Para compilar este programa utilizamos el siguiente comando en linea de comandos
$ gcc message_send.c -o message_send
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 19
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 20

Ejercicio 10
Crear el siguiente programa en c, que hace referencia a un programa que escribe, llamelo message_rec.c,
compílelo
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#define MSGSZ 128
/*
* Declara la estructura del mensaje.
*/
typedef struct msgbuf {
long mtype;
char mtext[MSGSZ];
} message_buf;
main()
{
int msqid;
key_t key;
message_buf rbuf;
/*
* Consigue el id de la cola de mensje para el
* "name" 1234, el cual ha sido creado por
* el servidor.
*/
key = 1234;
if ((msqid = msgget(key, 0666)) < 0) {
perror("msgget");
exit(1);
}

/*
* Recibe una respuesta del mensaje de tipo 1.
*/
if (msgrcv(msqid, &rbuf, MSGSZ, 1, 0) < 0) {
perror("msgrcv");
exit(1);
}
/*
* Imprime la respuesta.
*/
printf("%s\n", rbuf.mtext);

exit(0);
}
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 21

Para compilar este programa utilizamos el siguiente comando en linea de comandos


$ gcc message_rec.c -o message_rec
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 22

II. SOLUCIÓN DE EJERCICIOS PROPUESTOS

Ejercicio 1. Reescriba el programa del ejercicio resuelto 3 para que se pueda validar el ingreso de
números enteros

- Se introdujo una validación para asegurarse de que la entrada sea un número entero válido antes de
continuar.
- Si la entrada es un número entero válido, se convierte a una cadena antes de ser enviada a la cola
de mensajes.

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>

#define MAX 10

// Estructura para la cola de mensajes


struct mesg_buffer {
long mesg_type;
char mesg_text[100];
} message;

int main() {
key_t key;
int msgid;

// Generar una clave única para la cola de mensajes utilizando ftok


key = ftok("progfile", 65);

// Crear una cola de mensajes (o abrir una existente)


msgid = msgget(key, 0666 | IPC_CREAT);

message.mesg_type = 1;

// Solicitar al usuario que ingrese un número entero


printf("Escribe un número entero: ");

char input[MAX];

if (fgets(input, MAX, stdin) == NULL) {


perror("Error al leer la entrada");
exit(1);
}

// Verificar si la entrada es un número entero


char* endptr;
long num = strtol(input, &endptr, 10);

if (*endptr != '\n' && *endptr != '\0') {


printf("La entrada no es un número entero válido.\n");
exit(1);
}
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 23

// Convertir el número a una cadena antes de enviarlo a la cola de


mensajes
snprintf(message.mesg_text, sizeof(message.mesg_text), "%ld", num);

// Enviar el mensaje a la cola de mensajes


msgsnd(msgid, &message, sizeof(message), 0);

// Mostrar el mensaje enviado


printf("El número enviado es: %s\n", message.mesg_text);

return 0;
}
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 24

Ejecución

Ejercicio 2. Utilizando una tubería simple, redireccione la salida del ejercicio resuelto 2 a un archivo de
texto simple

Para redirigir la salida del ejercicio resuelto 2 de nombre ‘leer.c’a un archivo de texto utilizando una
tubería simple |, se ejecuta el programa del ejercicio resuelto 2 y, al mismo tiempo, redirigir su salida
estándar a un archivo utilizando un comando como cat

./leer | cat > salida.txt

En este caso, el programa "leer" se ejecuta y su salida estándar se envía a través de una tubería al
comando cat, que a su vez redirige la salida a un archivo llamado "salida.txt". La tubería | se utiliza para
conectar la salida del programa al comando cat. El resultado es que la salida generada por el programa se
almacena en el archivo "salida.txt".

Primero debemos ejecutar el ejercicio resuelto 1 (crear.c). Luego recién podemos ejecutar leer.c y
redireccionar la salida:
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 25

Ejercicio 3. En el ejercicio resuelto 5 reacomode el tamaño del buffer para mensajes de cadenas de
longitud de 8 caracteres

Modificamos la longitud del campo mtext de la estructura my_msgbuf para que tenga 8 caracteres en lugar
de 200. No necesitaría modificaciones significativas para que el campo mtext de la estructura my_msgbuf
tenga una longitud máxima de 8 caracteres. Dado que el programa ya utiliza fgets para leer líneas de texto,
este enfoque funcionará de manera adecuada sin cambios adicionales.
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 26

Ejecución
UNIVERSIDAD NACIONAL DE SAN AGUSTIN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA

Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación


Aprobación: 2022/03/01 Código: GUIA-PRLE-001 Página: 27

III. SOLUCIÓN DEL CUESTIONARIO

1. ¿Qué hace la biblioteca sys/ipc.h en los ejercicios resueltos?

La biblioteca sys/ipc.h se utiliza en los ejercicios resueltos para trabajar con las funciones y estructuras
relacionadas con la gestión de claves y control de colas de mensajes en el contexto de la programación en C.

Definir estructuras de datos que son necesarias para operaciones IPC, como la estructura struct ipc_perm
que almacena información de permisos.

Definir funciones para la creación de claves únicas utilizando ftok.

Definir funciones para la creación y gestión de colas de mensajes, semáforos y segmentos de memoria
compartida, como msgget, semget, shmget, y funciones relacionadas.

Definir constantes y macros que son necesarias para configurar permisos y opciones en las llamadas a las
funciones IPC.

2. ¿Dónde se ubica la librería types.h en su distribución Ubuntu?

La biblioteca types.h se encuentra en la distribución Ubuntu en la siguiente ruta:


/usr/include/sys/types.h

Si se está compilando un programa y se produce un error que indica que no se encuentra el archivo
sys/types.h, es posible que falte instalar el paquete de encabezados de desarrollo correspondiente. En ese
caso, se puede instalar el paquete libc6-dev

También es posible que el archivo types.h se encuentre en la ruta /usr/include/linux/types.h en lugar de


/usr/include/sys/types.h

REFERENCIAS Y BIBLIOGRAFÍA
[1] Giordani Leonardo. 2013 07 21 Programación Concurrente - Colas de mensajes : online, Available:
http://www.linuxfocus.org/Castellano/March2003/article287.shtml
[2]The Open Group Publications Catalog. Accedido el 13 de octubre de 2023. [En línea]. Disponible:
https://pubs.opengroup.org/onlinepubs/7908799/xsh/sysipc.h.html
[3]“Where is sys/types.h located?” Stack Overflow. Accedido el 13 de octubre de 2023. [En línea]. Disponible:
https://stackoverflow.com/questions/11823063/where-is-sys-types-h-located

También podría gustarte