parole.c, cuya adecuada compilación producirá
el ejecutable parole. En esencia, el programa
producirá palabras de cuatro letras durante 30s siguiendo
el procedimiento y las restricciones que a continuación se
detallan.
Parole acepta un único argumento de la línea
de órdenes. Es un número entero mayor o igual que cero
relacionado con la rapidez con que se producen los acontecimientos
en el programa. Cero indica la máxima rapidez y números
mayores suponen una rapidez progresivamente menor.
libparole.a.
Gracias a ella, muchas de las funciones no las tendréis
que programar sino que nada más tenéis que incluir
la biblioteca cuando compiléis el programa. La línea de
compilación del programa podría ser:
c89 parole.c libparole.a -o paroleLa biblioteca creará algún proceso adicional a los vuestros para su funcionamiento interno. Estos procesos también tenéis que eliminarlos al finalizar el programa. Una descripción detallada de la biblioteca aparece más abajo en esta misma página.
inicio_parole(...)
de libparole. Por una de las tuberías,
libparole le enviará consonantes y,
por la otra, vocales. Después de llamar a
inicio_parole(...), P crea a
sus dos procesos hijos, C y V. Hasta que transcurran los
30 segundos, P leerá de las tuberías. No debe dar
preferencia a ninguna de ellas. Si acaba de leer
de la tubería de las consonantes deberá:
IR_A_POR_CONSONANTE al
buzón de usuario. Se debe usar una
variable de tipo struct mensaje
para enviar los mensajes. Tanto la
macro IR_A_POR_CONSONANTE
como la estructura struct mensaje
se encuentran definidas en el fichero de
cabecera parole.h. Dentro
del mensaje enviado, en el campo letra
debe ir la letra recibida por la tubería.
ANADIR_CONSONANTE
con la letra leída de la tubería. Libparole
se encargará de gestionar todo y de añadir
la consonante a la cola. Vuestro programa
no tiene que hacer nada más que mandar el
mensaje.
tomar_letra
de libparole para obtener la
primera letra de la cola.
imprimir_palabra(...) de
libparole.
validar_palabra de
libparole para que la biblioteca
compruebe que la palabra formada es correcta.
TIME de la orden
ps. No debe reflejar ni tan siquiera
un segundo al final de la ejecución del programa.
libparolelibparole.a
y el fichero de cabecera parole.h. La biblioteca
funciona con los códigos de VT100, por lo que debéis adecuar
vuestros simuladores a este terminal.
libparole.a:
para Solaris,
para RedHat 5.2,
para RedHat 8.
parole.h:
Para todos.
int inicio_parole(int ret, int semAforos,
int buzOn, int buzOn2, char *palabra, int *tubos)
ret: valor de retardo que
se obtuvo de la línea de órdenes.
semAforos: array de semáforos.
De este array, se debe reservar el primer
semáforo para uso exclusivo de la biblioteca.
buzOn: buzón de usuario.
A este buzón el proceso P envía los
mensajes.
buzOn2: buzón para la biblioteca.
Este buzón es de uso exclusivo para la
biblioteca. No se debe mandar nada a él.
palabra: puntero al inicio
de la zona de memoria compartida. En los
cuatro primeros bytes de esta zona reside
la palabra que se está formando. El resto,
queda a disposición del programador.
tubos: un array con dos
descriptores de fichero. El primero es
la boca de escritura del tubo de consonantes
y el segundo pertenece a la boca de
escritura del tubo de vocales. En ellos
escribirá la biblioteca consonantes y
vocales para que el proceso P los lea
por la parte de lectura de los tubos.
char tomar_letra(int cuAl)
cuAl=CONSONANTES) o vocales
(cuAl=VOCALES).
void imprimir_palabra(int cuAl,int pos)
pos (1-4) de la palabra
que se está formando. cuAl indica si
el proceso que lo hace es C
(cuAl=CONSONANTES) o V
(cuAl=VOCALES).
void validar_palabra(void)
void locate(int fila, int columna)
fila,
columna columna de la pantalla.
void print_at(int fila,int columna,
const char*texto)texto en la fila fila,
columna columna de la pantalla. Esta función
y la anterior vacían el flujo de salida estándar de modo
automático.
inicio_parole en
main.
select en el programa principal y
que nos lea de las tuberías apropiadas y distinga entre
vocales y consonantes. Ir en libparole a por las letras
leídas mediante el buzón de usuario.
pause();
temporalmente. Crear los procesos C y V que están
continuamente solicitando a libparole letras de su
correspondiente cola. Como la cola está vacía,
pondrá error. Solucionar dicho error.
SEMÁFOROS Y VALOR INICIAL: SC=1, SV=0.
SEUDOCÓDIGO:
C V
=== ===
Por_siempre_jamás Por _siempre_jamás
{ {
W(SC) W(SV)
escribir_consonante escribir_vocal
S(SV) S(SC)
} }