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.
libparole
libparole.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) } }