ELO-330: Programación de Sistemas

Tarea 2: Formulación y Selección de Preguntas en Foro

Objetivos

- Diseñar una arquitectura para comunicar, vía memoria compartida, procesos no relacionados entre sí dentro de una máquina
- Aplicar semáforos para el acceso exclusivo a datos compartidos en la memoria de una máquina
- Ejercitar el uso de GIT
- Preparar documentación de un sistema de software
- Conocer un mecanismo para ejecutar aplicaciones a través de la WEB usando PHP.

Contexto

    En las comunidades con democracia representativa es común organizar elecciones donde la comunidad elige a quienes la representarán en consejos, centros, o quienes las dirigirán. En estos procesos de elección es necesario informar a la comunidad los proyectos o visiones de cada candidato a un cargo de representación. Para tal propósito se suelen organizar foros o debates donde la comunidad tiene la oportunidad de formular preguntas a los candidatos. Para organizar tal proceso, suele haber un moderador que recibe las preguntas y, generalmente al azar, las selecciona para ser respondidas por los candidatos.

    Inspirada en la situación previa, en esta tarea se desarrollarán tres programas: uno para ingresar una pregunta, otro para seleccionar una pregunta al azar, y un tercero para poner en marcha y concluir el foro de preguntas. Los tres programas corren en una misma máquina. Con la ayuda de una pequeña aplicación escrita en PHP, el programa seleccionador de preguntas se puede ejecutar a través de un servidor WEB y así mostrar cada pregunta en formato html a través de un browser. Se busca principalmente diseñar un sistema básico y aplicar conceptos de programación listados en los objetivos. No se busca un sistema a toda prueba; por ejemplo, aspectos de seguridad para restringir el acceso a ciertos usuarios no son considerados.

Programas a Desarrollar

Desarrolle los siguientes programas: foro_setup, foro_qsu (por question submission), foro_qse (por question selection).

foro_setup : Foro setup - programa para iniciar y poner término al foro.
Sintaxis:    foro_setup  ( b N | e ) Nombre_parcial_de_zona_compartida
Descripción: foro_setup crea una zona de memoria compartida y los recursos necesarios para su acceso exclusivo (semáforos) por parte de otros procesos. Usted puede imaginar que se crea un buzón para almacenar preguntas. Este programa usa la biblioteca POSIX. La zona de memoria compartida almacena un arreglo de N entradas y otros datos para implementar una lista circular. Cada entrada del arreglo puede tener la siguiente estructura:

struct Question {
   char name[MAX_NAME_LENGTH];  /* Name of who asks the question */
   char text[MAX_QUESTION_LENGTH];    /* question text */
};

La lista circular de preguntas puede tener la siguiente estructura:

struct Circular_List {
   int head;   /* first element index */
   int tail;      /* last element index */
   struct Question questions[N];
};

El parámetro b indica que se desea dar inicio (begin) al foro, en este caso debe ingresarse además el parámetro N, número máximo de preguntas de la lista. El parámetro e (end) pone término al foro y libera los recursos compartidos creados con la opción b.  En ambos casos, al final se debe especificar un nombre (string) para identificar de manera única un foro particular en la máquina. Este string es usado por los programas para identificar los recursos compartidos dentro del sistema (memorias, semáforos, etc). El programador elige post-fijos de este nombre para identificar de manera única la memoria compartida, los semáforos, u otros recursos compartidos.

foro_qsu: Foro question submission  - programa para ingresar una pregunta al foro.
Sintaxis: foro_qsu N Nombre_parcial_de_zona_compartida
Descripción: foro_qsu solicita al usuario su nombre completo y luego su pregunta. Posteriormente, almacena ambos textos en la lista de preguntas y termina. El parámetro indicado, Nombre_parcial_de_zona_compartida, permite identificar en forma única el foro al cual ingresar la pregunta. Si la lista de preguntas estuviera llena, foro_qsu se bloquea hasta que una pregunta sea removida por foro_qse y así foro_qsu pueda ingresar su pregunta en la lista.

foro_qse: Foro question selection - programa para seleccionar una pregunta del foro.
Sintaxis: foro_qse N Nombre_parcial_de_zona_compartida
Descripción: foro_qse selecciona y remueve desde la lista circular una pregunta y envía a su salida estándar el nombre de su autor y la pregunta en cuestión. Para su mejor visualización en un navegador (tamaño, color, font, etc) el nombre del autor y su pregunta son enviados a la salida en formato HTML. El parámetro indicado, Nombre_parcial_de_zona_compartida, permite identificar el foro del cual extraer la pregunta. Una vez seleccionada la pregunta ésta es removida de la lista de preguntas dando así la opción a que una nueva pregunta sea ingresada. En ausencia de preguntas en la lista, foro_qse debe bloquearse hasta que foro_qsu ingrese una pregunta.

Mientras foro_setup y foro_qsu son ejecutados desde la línea de comandos, foro_qse es ejecutado a través de una aplicación PHP invocada desde un browser. Así el browser interpreta el lenguaje html y se logra un mejor despliegue de la pregunta.

Como parte de lo solicitado en las instrucciones para tareas en C (o C++), usted debe incluir la página web con el código PHP que permite ejecutar foro_qse.

Extra-crédito: Usted puede ganar 5 puntos adicionales (su nota igualmente se satura en 100), si propone un esquema en que el parámetro N puede ser omitido al ejecutar foro_qsu y foro_pse.

Ayuda

* Aquí usted puede ver una página PHP básica para ejecutar esta aplicación simple. La página PHP contiene:

<?php
system("./exe foro_2019_2s_I");
?>
Usted puede dar mayor formato a la página incorporando más rótulos HTML según desee.

* Revise estos ejemplos y estos ejercicios.

* En clases o en horario de atención a estudiantes, el profesor atenderá con gusto cualquier consulta.
* Más ayuda puede ser incluida en la medida que surjan preguntas.
* Haga su tarea de a poco y con tiempo.