Tolkien2.c
, cuya adecuada compilación producirá
el ejecutable Tolkien2
. Respetad las
mayúsculas/minúsculas de los nombres.
kill
cuando se
ejecute la práctica.
sleep()
).
Tolkien2
.
energia
de
tipo long long
.
energia
comenzará con el
valor de 200000.
energia
en pasos de dos en dos.
energia
de uno en uno.
SARUMAN
, 62 espacios en blanco para el
campo de batalla y GANDALF
.
energia
valga 0,
el cursor se posicionará sobre el segundo espacio,
cerca de SARUMAN.
Si alcanza su valor límite, el cursor se pondrá sobre
el espacio sexagéximo segundo.
En una situación intermedia
el cursor se posicionará proporcionalmente al valor
de la energía.
ps
-f
con su nombre. Esto significa que será necesario
usar una llamada de la familia exec
para
reemplazar argv[0]
, aunque vayamos a ejecutar
el mismo ejecutable. Esto os servirá también para que
vuestro código diferencie qué personaje se está ejecutando
en cada momento. En esta práctica no se podrá pasar
nada a los procesos hijos a través de los argv
s,
sólo cambiarles el nombre. Tampoco se podrán usar
ficheros para nada. Las comunicaciones de PIDs o similares
entre procesos se harán mediante mecanismos IPC.
sleep()
, se refiere a la llamada al sistema,
no a la orden de la línea de órdenes.
ipcs
.
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) } }
SIGINT
a los procesos que estén
en primer plano. Para probarlo, mandad el proceso
a primer plano con fg %
y pulsad
entonces CTRL+C.
exec
. La respuesta
obvia es que sí. El problema que tenéis no es
ese. El problema es que si hacéis un
semget
, por ejemplo, almacenáis
el identificador de los semáforos en una variable
entera. Es esa variable la que no sobrevive al
exec
. La solución está en usar
ftok
para crear los semáforos y que los
procesos hijos que los necesiten vuelvan a hacer
un semget
con la misma clave, pero
sin especificar IPC_CREAT
.
int semAforo=-1
. En la
manejadora de SIGINT
, sólo si
semAforo
vale distinto de -1,
elimináis el recurso con semctl
.
Esto es lógico: si vale -1 es porque no se ha
creado todavía o porque al intentar crearlo
la llamada al sistema devolvió error. En ambos casos,
no hay que eliminar el recurso.
SIGINT
, podéis declarar una
estructura que los contenga a todos y así
sólo gastáis un identificador del espacio
de nombres globales.
wait
.
A vosotros os pasa con semop
, pero es
lo mismo. De las dos soluciones que propone el
apartado, debéis usar la segunda.
semctl
de
Solaris (con union semun
), como
se explica en la sesión de semáforos y no la de
HPUX.
energia
puede tener un valor comprendido
entre 0 y 599999. Si dividís su valor por 10000,
os queda un número entre 0 y 59. Ese número es la
posición del cursor dentro de los 62 espacios,
dejando un espacio de margen a cada lado. Si gana
SARUMAN, el cursor se pone en el primer espacio
(pegado a su nombre). Si gana GANDALF (las apuestas
van 100000 a 1), el cursor se pone en el último espacio
de los 62, justo antes de su nombre.