Enunciado.
La práctica consistirá en un solo fichero fuente,
palabro.c
. El programa, una vez compilado y
ejecutado constará de cuatro procesos, cada uno con las
acciones que se describen:
- Proceso padre: estará unido mediante sendas tuberías
sin nombre con sus tres hijos. Esperará a que haya
datos por cualquiera de las tuberías y los imprimirá
por la pantalla. El programa estará continuamente
haciendo esto hasta que reciba doce palabras
(es decir, doce espacios).
- Proceso C: llamará continuamente a la función
genera_c
, que genera una consonante y
la escribirá por la tubería que le conecta con
el padre.
- Proceso V: igual que el anterior pero con la función
genera_v
, que devuelve una vocal.
- Proceso E: llama continuamente a la función
genera_e
, que puede devolver o un
espacio o un carácter '0'. Si devuelve un espacio,
lo manda por la tubería que le conecta con el padre.
Si devuelve cero, no hace nada.
Los procesos C, V y E llamarán a sus funciones cada 0.1
segundos (se puede usar nanosleep
).
Los procesos C, V y E, regularán mediante semáforos
(ellos, no el padre) que se cumplan las siguientes reglas
de sincronización:
- Las consonantes se pueden mandar sólo después
de un espacio o de una vocal.
- Las vocales se pueden mandar sólo después de
una consonante.
- Los espacios se pueden mandar sólo después de
una vocal.
El primer carácter que se imprime ha de ser una
consonante.
Las funciones que se necesitan vienen a continuación:
#include <stdlib.h>
#include <string.h>
#define genera_c() genera("BBCCDDFGGHJLLMMMNNPPRRSSSTTVVYZ")
#define genera_v() genera("AAAEEEEIIOOOUU")
#define genera_e() genera("00 0")
char genera(char lista_cars[])
{return lista_cars[(int)(rand()/(RAND_MAX+1.0)*strlen(lista_cars))];}