miércoles, 28 de abril de 2010

Hoy no me quejo

Hoy no puedo permitirme el lujo de quejarme. Acabo de dar un pequeño paso de gigante en mi proyecto de fin de carrera (¿pequeño paso de gigante? Si que estoy mal eh xD). No, en serio, es una bobadita pero es una de las cosas básicas que más miedo me daba, que llevo tratando de solventar meses y que, hoy, por fin, he agarrado por los cuernos y se me ha ocurrido la solución que voy a utilizar porque...

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡FUNCIONA!!!!!!!!!!!!!!!!!!!!!!!!!!!

Por fin puedo insertar referencias dependientes del tipo con sus campos extra, realizar validaciones complejas "a mano". Si, es una mierda, sólo está hecho para un tipo de referencia y encima por ahora sólo se ve con el MySQL Query Browser pero me da igual, el resto es trivial. Solo es picar código.
Si ahora hubiera alguien aquí estaría flipando... xD, con la música a todo volumen y haciendo el ganso como lo hice cuando solucioné 2 problemas de la Olimpiada Informática. DIOSSSSS por estupideces como esta soy informático.
Encima me ha llegado uno de los paquetes que había pedido a eBay :-), me acaba de llegar ahora mismo.Y ahora os voy a dejar la canción que suena ahora mismo y es una de las mejores para mi tanto en la solución de la Olimpiada como ahora mismo:




Te sientes distinto al resto de la gente.

Te sientes distinto al resto de la gente
te sientes distinto te sientes diferente
te dice tu instinto que hoy vas a tener suerte
te sientes bien y es que hoy nada es como ayer.

Se vive se nota en el ambiente
que todo esto a ti te divierte
Hoy vas a comerte el mundo
hoy no pierdas un segundo
y a disfrutar tu sonrisa luciras
(luciras tu sonrisa mas especial)
Aunque existan los problemas
todo marcha sobre ruedas
y gritaras todo va a cambiar.

Te sientes distinto se acabaron tus penas
es todo optimismo ves la botella medio llena
y sientes que corre la sangre por tus venas
te sientes bien y es que hoy nada es como ayer.

Se vive se nota en el ambiente
que todo esto a ti te divierte
hoy vas a comerte el mundo
hoy no pierdas un segundo
y a disfrutar tu sonrisa luciras
(luciras tu sonrisa mas especial)
Aunque existan los problemas
todo marcha sobre ruedas
y gritaras todo va a cambiar.

Hoy vas a comerte el mundo
hoy no pierdas un segundo
y a disfrutar tu sonrisa luciras
(luciras tu sonrisa mas especial)
Aunque existan los problemas
todo marcha sobre ruedas y
gritaras todo va a cambiar.

Hoy vas a comerte el mundo
hoy no pierdas un segundo
y a disfrutar tu sonrisa luciras
(luciras tu sonrisa mas especial)
Aunque existan los problemas
todo marcha sobre ruedas
y gritaras todo va a cambiar.

Hoy vas a comerte el mundo
hoy no pierdas un segundo
y a disfrutar tu sonrisa luciras
(luciras tu sonrisa mas especial)
Aunque existan los problemas
todo marcha sobre ruedas
y gritaras todo va a cambiar.

Te sientes distinto al resto de la gente.

viernes, 23 de abril de 2010

El día que Linux volvió a la PS3

Ahora mismo me hallo instalando la actualización 3.30 de mi PS3 con lo que perderé la posibilidad de instalar otro sistema operativo en ella. ¿Qué deduzco de todo esto? Que esta noche o mañana GeoHot sacará el custom firmware que está preparando.
Pero si os digo la verdad, no me importa en demasía, sigo opinando que grabar blu-ray's copia de los juegos de PS3 no merece la pena. Te van a costar más los blu-ray y la grabadora que los juegos. Tengo demasiados juegos sin pasar, últimamente soy muy legal... Me molesta perder algo que venía en la consola pero, ¿en realidad iba a usarlo alguna vez de verdad? Me refiero, a lo mejor alguna vez instalaba un SO diferente para hacer la bobada, pero no pasaría de ahí. No soy un investigador que se haya montado su superordenador con 8 PS3, ni lo voy a ser.
Me bajé el Unreal Engine 3 para Windows ¿para qué? Para decir "Eh miradme, tengo el UDK funcionando en mi pc", si no se ni moverme por la puta pantalla. Con mi PS3 quiero facilidad... meter el juego y jugar. Si me quiero bajar una demo, que me deje, incluso algún juego de la PSN, todo en su justa medida, y que coño, los trofeos. Me gustan si, ¿qué pasa? Es mi aliciente para completar los juegos.
De todas formas, creo que llega un momento en la vida de todo amante de las consolas (cuidado que no he dicho gamer) en que tiene que dejar de montarse historias para jugar a juegos gratis. Todo el mundo sabe que al final, tarde o temprano se podrá, estemos en el Firmware que estemos, hagamos lo que hagamos. Y ahora mismo no me merece la pena un posible baneo de Sony, aunque no use mucho el online, que para una vez que soy legal...
Y si, como ya he dicho, me jode que quiten Linux, pero es su plataforma, nadie les obligó a ponerlo. Y hay que reconocer que han hecho un fantástico trabajo de seguridad con esta consola, hasta que ellos no filtren como burlar al Hypervisor... xD.
Bueno, el último "Ok"... Adiós OtherOS.... ya, no ha sido tan terrible, no me ha dolido ni nada de eso xD.
Pues lo que iba diciendo, si todos queremos que sigan existiendo juegos y consolas que nos hagan olvidarnos un ratito de nuestros problemas, no podemos estar buscando constantemente formas para robar, aunque ellos nos roben con los precios que ponen, allá cada cual con su conciencia.
Y chavales, una consola es una consola, como mucho (y ya es mucha concesión) centro multimedia, pero no es un ordenador. No confundamos conceptos que últimamente nos ha dado por mezclar aparatos y salen híbridos mal hechos como los "smartphones" pero de eso ya hablaré otro día.
Larga vida a Tux, te rogamos Richard Stallman, oyenos (dios, hace tiempo que perdí la pinza... y ya no vuelve)

jueves, 22 de abril de 2010

Día de la Tierra 2010

Un poco tarde es ya, pero eso no quita para que felicite a la ¿Tierra? por su día. Que ya se nos está quejando la pobre, un tiempo demasiado extraño, muchos terremotos y erupciones...
Por fin nuestra madre Gaia se ha dado cuenta de que no merecemos la pena, por fin parece que quiere echarnos y que la evolución vuelva a funcionar a marchas forzadas para que sólo sobrevivan las razas más fuertes.
Y nosotros amigos... no somos una de las más fuertes biologicamente hablando, aunque nos guste auto denominarnos la raza dominante del planeta o los más evolucionados... Sólo porque tengamos unas cuantas conexiones neuronales más que otras especies, que encima ni usamos...
Pero bueno, la cosa es que hoy es el día de la Tierra y, como el año pasado, para celebrarlo Disney Nature ha realizado otro documental que, al igual que el de el año pasado "Earth", quiero ver.
Este año se trata de Oceans, el hasta ahora más caro documental de la historia, quitándole el puesto a Earth por supuesto. Y es que estos de Disney, cuando hacen algo, lo hacen bien.
Os dejo aquí 2 trailers del documental para ver qué os parece, y espero que os guste. Este viernes lo estrenan en cines aquí en España, por si alguien se anima a verlo.





Por cierto, como siempre, os recomendaría verlos en la más alta definición que podáis. xD

Regresa Perry

Ayer Youtube me sugirió este vídeo y, como no, acertó. Os lo pongo porque la canción aunque de mi estilo, totalmente carente de sentido y absurda estrofa a estrofa, me parece bonita. Que os guste:



Phineas y las Ferbets

Perry, eres amigo bueno y fiel
y aunque tengas más nivel
eres un premio de mejor
Oh Perry,
eres mejor que un buen pastel,
más que un chupito, un moscatel
y todo lo que he dicho en la frase anterior
Oh Perry
eres extraordinario
peludo y legendario
bajito y tan necesario

Si Perry
regresa Perry
vamos vuelve al hogar

Candance

Oh Perry, Me tienes asusterri
no te encuentro ni en el ferry
al fin me deses¿perry?
Oh Perry
¿qué digo? erre que erre
de aquí me mudo y echo el cierre
y ahora me llamo Lerry

Todos

Ahora se llama Lerry
Lerry, Lerry
Oh vamos Perry
vamos vuelve al hogar
Oh vamos Perry
vamos vuelve al hogar
Vamos, ven por favor

La noche se auguraba larga pero, ¿tanto?

Como pudisteis leer anoche, parecía que iba a ser una laaaaaaaaaaaaaaaaaaaaarga noche, pero nunca pensé que lo fuera a ser tanto. Las cosas seguían empeorando por momentos.
No sólo paró de llover, sino que, me eché en la cama a leer, como siempre, y la luz dijo "adiós" y ya no se vio más, en mi casa... porque el resto de la calle... sin problemas.
Por supuesto, como no se sabe andar a oscuras en este puto planeta, no he podido pegar ojo de ruidos de "fiesta", qué diversión!!!!!!!! Pero hay que levantarse, como todos los días, sin ni siquiera un objetivo, sólo con la obligación de seguir poniendo buena cara a todo el mundo...
¿Cómo mataré hoy mi propia alma? ¿Qué haré esta noche? ¿Desafíos del God, Final Fantasy? ¿Me servirán los juegos o tendré que seguir con los gastos que vuelven a ser costumbre esta semana?
Total, si sólo llevo 100 € y no he comprado más que mierda... ¿qué más da?
Ale, supongo que va siendo hora de volver a mi estupenda vida, seguir con un trabajo de fin de carrera que no creo que pueda acabar y que me va a dar más problemas que un tonto, pero bueno... Hay que seguir...

La tormenta, que anunció el cielo

La lluvia, parecía que me había aclarado un poco las ideas, pero ya vuelve todo, ya no suena a penas el agua... vuelven a joderse cosas que quería hacer... aunque fuera algo tan simple como oír la lluvia. Creo que con esa acción no hacía daño a nadie, como mucho a mi mismo por no acostarme pronto.
Bueno, puede que haya tenido que ver, también, la excitación de haber acabado un juego (podría decir que casi lo único bueno del día).
Pero todo se me está volviendo a nublar por momentos, tenía muchas ideas para escribir, y se están yendo todas por el retrete por segundos, la nube vuelve a caer sobre mi mismo.
El cielo ya anunciaba desde la mañana una gran tormenta, está cayendo pero... aquí ha pasado, básicamente...
Como veis no soy capaz de escribir nada lo suficientemente coherente, todo se ha ido, todo se ha acabado... como la tormenta

Y al final... sólo hubo Caos

Bueno, me complace, y a la vez entristece, anunciaros que hoy me he pasado el God of War 3 y os puedo garantizar que, a parte del hecho de que se os va a hacer corto, porque jugaríais mucho más, es uno de los mejores juegos de las consolas de 7ª generación. Y el final... Kratos no decepciona, al menos a mi no me ha decepcionado...
Lo ha tenido todo, giros de trama, cambios, cosas que te esperas, cosas que no ves ni venir... El final... precioso, coherente... la lástima de no haberlo visto en HD y que se haya terminado, pero no me arrepiento de haberlo acabado. La verdad es que ha sido muy bueno. Ahora tengo otros cuantos juegos, desafíos y demás cosas de los GoW's... mucho pero al menos voy pasando los juegos, cosa que hacía mucho que no ocurría, y ahora llevo muy buena racha.
Lo que espero es que no se me jodan los trofeos, porque no me los deja sincronizar al no tener la consola actualizada, pero estoy aguantando un tiempo a ver que pasa con lo de Linux y tal...

En el fondo de la caja, la caja que contenía los males, sólo quedó una cosa...

jueves, 15 de abril de 2010

¿Cómo sienta recuperar viejos hábitos?

Bueno, en realidad no debería decir hábito sino hobbie pero bueno, creo que me repito menos así. Al grano, cómo no tengo sitio para más puzzles, he decidido tratar de volver a pintar miniaturas. Hace tiempo lo hacía y no se me daba del todo mal. Incluso tengo alguna de la que me siento orgulloso, pero claro, esas son de mis tiempos más activos.
Ahora supongo que ya no sabré ni mover el pincel por la pequeña superficie de las miniaturas. Además cuando he tratado de retomar esta actividad me he dado cuenta que tengo casi todas las pinturas secas... Tampoco puedo quejarme ya que la última vez que pinte algo con esas pinturas fué hace casi 3 años, y hace que no pinto de seguido varias miniaturas lo menos 5.
He estado buscando algún kit de iniciación o algo así pero por Samancanca, parece ser que ya no venden. Tendré que hacer una limpieza global y ver qué pinturas necesito de primeras. Estoy demasiado mal acostumbrado a tener demasiados colores... y creo que eso no es bueno... deberé retomar los orígenes en los que había poco más que los colores básicos, blanco, negro, y muchas mezclas.
No se qué tal me sentará este cambio. La verdad es que tengo ganas de volver a dar "vida" a esas figuras de plástico y plomo. Mi vieja paleta espera, los pinceles están un poco destrozados pero ya no hay tanto dinero como cuando era pequeño. Al fin y al cabo ahora hay otras prioridades...
Os prometo que si al final retomo y hago algo que merezca la pena enseñar y de lo que no me avergüence lo colgaré aquí para que lo veaís.
Una de las miniaturas que me gustaría acabar, por fin, sería mi dragón, razón por la cual empecé, siendo un mocoso, a pintar, pero que, por unas causas y otras ha ido mutando, cambiando de color, y ahora se encuentra en una fase en la que parecía que por fin iba a "nacer" con colores definitivos pero quedó a medias, aunque muy bonito eso si. Estaba orgulloso del currazo que me estaba dando... escama a escama...
Ale, ya no os doy más el coñazo que es tarde. Hasta pronto

Dentist! - Little Shop of Horrors

Hoy os traigo una canción de un musical. Para mi gusto muy buena (dentro de la frikez que es la película). Espero que os guste xD.



[ORIN]
When I was younger, just a bad little kid,
My mama noticed funny things I did,
Like shootin' puppies with a B B gun
I'd poison guppies, and when I was done
I'd find a pussycat and bash in its head
That's when my mama said

[CRYSTAL, RONETTE, CHIFFON]
What did she say?

[ORIN]
She said, "My boy, I think someday
You'll find a way
To make your natural tendencies pay
You'll be a dentist
You have a talent for causin' things pain
Son, be a dentist
People will pay you to be inhumane
Your temperament's wrong for the priesthood
And teaching would suit you still less
Son, be a dentist
You'll be a success

[CRYSTAL, RONETTE, CHIFFON]
Here he is, folks the leader of the plaque!
Watch him suck up that gas!
Oh, my god!
He's a dentist and he'll never ever be any good
Who wants their teeth done by the Marquis de Sade?

[PATIENT]
Oh that hurts! I'm not numb!

[ORIN]
Oh, shut up. Open wide. here I come!
I am your dentist

[PATIENT]
Goodness gracious!

[ORIN]
And I enjoy the career that I picked

[CRYSTAL, RONETTE, CHIFFON]
Really love it

[ORIN]
I am your dentist

[PATIENT]
Fitting braces

[ORIN]
And I get off on the pain I inflict

[CRYSTAL, RONETTE, CHIFFON]
Really love it

[ORIN]
I thrill when I drill a bicuspid

[CRYSTAL, RONETTE, CHIFFON]
Bicuspid

[ORIN]
It's swell though they tell me I'm maladjusted
And though it may cause my patients distress,
Somewhere, somewhere in heaven above me
I know, I know, that my mama's proud of me
Oh, mama
'Cause I'm a dentist and a success
Say ah!

[PATIENT]
Ah!

[ORIN]
Say ah!

[PATIENT]
Ah!

[ORIN]
Say ah!

[PATIENT]
Ah!

[ORIN]
Now spit!

sábado, 10 de abril de 2010

El principio del fin

Hoy he acabado el God of War 2, tras varios años. Lo "tuve" que reempezar en la PS3 y por fin está acabado. Sólo en modo normal eso sí. Deciros que es genial, que estoy deseando seguir con la venganza del Espartano más agresivo y famoso del mundo de las consolas.
Si ya el final del 1 era bueno este lo supera y puede que el 3 sea aún mejor. Solo el tiempo y el juego lo dirán. De todas formas no voy a empezar todavía el GoW 3. No se qué haré pero aún no lo voy a empezar porque me vicio demasiado y no es bueno...
Ya os contaré

miércoles, 7 de abril de 2010

¿Qué le pasa a internet?

Vaya mierda, llevo ya todas las vacaciones sin nada decente que leer en los blogs de internet. Está empezando hasta a aburrirme navegar. No lo entiendo. ¿Es que no pasa nada en el mundo cuando no hay clases?
Espero que esta sequía se deba al descanso post grandes lanzamientos y pre enormes anuncios y aún más grandes promesas que no se llegarán a cumplir. Pero que le vamos a hacer, las compañías con algún tipo de relación con la informática son así, muchas promesas y pocos hechos.
Pero bueno, lo dicho, que internet lleva ya varios días muy muerto y eso no se puede permitir. Internet tiene que ser un ente vivo, grande, cada vez más. Que a este paso no voy a poder volver a perderme navegando por la red horas y horas, sintiéndome luego mal por el tiempo perdido xD.
Si es que me quejo de todo, el nombre del blog sigue siendo muy apropiado xDDD

¿Cómo seguir si ni siquiera ves camino más allá?

Llevo ya mucho tiempo así... ¿Cómo? os preguntareis. Pues siendo una incógnita, una puta incógnita. Ya no se quién soy, qué soy o qué camino quiero seguir. Hace años tenía las cosas muy claras.
Tenía marcado cada pasito que daba, más o menos seguro, con muchos tropiezos, pero al menos sabía dónde quería ir, y quién era. Quería ser un gran programador de videojuegos o un informático brillante al servicio de la investigación científica.
No era más que un niño, un niño grande si, pero un inmaduro y pedante niño, que se contentaba con tener cada vez más cosas que luego ni tocaba, caprichos. Un niño que seguía fantaseando, viendo películas de Disney y con una alta y exasperante moralidad.
No sé en que parte del camino me he perdido, pero la verdad es que ahora mismo no se dónde estoy ni por dónde quiero seguir. Y eso es lo grave, no que no sepa por dónde seguir, sino que no se por donde quiero seguir. Y si no se a dónde quiero ir a parar ¿cómo se supone que debo llegar? Ni siquiera se si avanzo, retrocedo, estoy quieto...
Ya no hay aspiraciones ni metas, ya no hay sueños ni fantasías, sólo hay inercia... Las cosas que me gustaban ya no representan nada. Compro, compro y compro, cada vez más cosas, pero nada de eso me hace sentir mejor. Nada es capaz de arrojar ni un rayo de luz sobre mi mismo, nada me da respuestas.
No hay nada que consiga satisfacerme completamente durante un periodo considerable de tiempo. La vida pasa muy deprisa y parece que últimamente sólo me limito a mirar como ocurre.
Como ya he comentado aquí otras veces, mi cabeza es un gran almacén en donde todo lo que hay esta tirado. Donde sería imposible encontrar nada. Ya no hay ideas, ya no hay pensamientos, sólo hay una serie de voces sin sentido ninguno que hablan todas a la vez, retazos de conversaciones, de obligaciones, de mi mismo.
Se que esto es algo en lo que me tengo que sumergir yo solo, como la mayor parte de mi vida. ¿Quién más podría ayudarme a encontrarme a mi mismo? Desde luego, aunque cada vez pierda más la cabeza, un psicólogo no me ayudaría...
Se que, probablemente, esté dañando a todas las personas lo suficientemente cercanas a mi como para ello. Por suerte son pocas, aunque el daño sea grande. De todas formas creo que nadie entiende lo que me ocurre, no les culpo, soy demasiado extraño. ¿Qué persona con 21 años pasa verdaderamente por algo así? Además, es algo tan subjetivo que para cualquier persona sería peor lo suyo que lo de los demás.
Procuro mirarme poco al espejo porque lo único que veo es a un completo extraño. No me reconozco a mi mismo. Parece como si mi cabeza estuviera divida en todos esos trocitos desordenados que forman el almacén. Cada uno de ellos tirando en una dirección de un espacio de infinitas dimensiones.
Diría que Twisen está pasando por uno de los mayores cambios de su vida, una metamorfosis de la que, ahora mismo, sólo hay un enorme capullo, pero para llevar a cabo una transformación hace falta tener una meta a la que llegar, y yo parece que no la tengo. Así que, en realidad, ¿qué me está pasando?

sábado, 3 de abril de 2010

Encrucijada (III: Mejor subida)

A la vista de la horrible subida que he realizado anteriormente os dejo en este nuevo post el código en C de la práctica y el PDF que entregué, todo ello con libre distribución y copia siempre que se cite la fuente (¿licencia GNU o Creative Commons?). Bueno la licencia... si nadie lo va a usar...

Encrucijada (y II: Solución)

Y aquí os dejo con la ansiada respuesta que entregué y con la que saqué un 9 (por culpa de que leí mal el enunciado, pero bueno la vida es así). No os la pongo con comentarios porque no se dónde tengo la versión final con lo comentarios. Lo primero viene la situación de los semáforos, el esquema básico de sincronismo y el código en C. Espero que os resulte útil.
Siento mucho lo mal que se ve pero no podía hacer nada mejor...

Situación inicial de los semáforos:
procesos = Max_proc – 1;
C1 = 0;
C2 = 0;
P1 = 1;
P2 = 0;
Cruce = 1;
Nacer = 1;

Esquema de sincronización

Padre

Leer_línea_comandos();

Crea_IPCS();

Prepara_IPCS();

CRUCE_inicio();

W(procesos);

Nace_ciclo_semafórico();

Por siempre jamás{

W(procesos);

Nace_coche_o_peatón();

}

Acabar

Si padre{

CRUCE_fin();

W(max_proc-1)(procesos);

Destruye_IPCS();

Muere();

} Si no{

Muerte_hijo();

}

Muerte_hijo

S(procesos);

Muere();

Ciclo_semafórico

SemC2 = Rojo;

Por siempre jamás{

W(P1);

SemP1 = Rojo;

SemC1 = Verde;

SemP2 = Verde;

S(C1) S(P2);

Pausa⁶();

W(C1) W(P2);

SemC1 = Amarillo;

SemP2 = Rojo;

Pausa²();

W(Cruce);

SemC1 = Rojo;

S(Cruce);

SemC2 = Verde;

S(C2);

Pausa⁸();

W(C2);

SemC2 = Amarillo;

Pausa²();

W(Cruce);

SemC2 = Rojo;

S(Cruce);

SemP1 = Verde;

S(P1);

Pausa⁶();

Coche

CRUCE_inicio_coche();

Mientras(posicion_válida){

Mueve_coche();

Pausa();

}

Fin_coche();

Envia_mensajes_última_posición();

Muerte_hijo();

Mueve_coche

Si (pos = posC1){

W(C1) W(Cruce);

Recibe_mensajes_pos_sig();

avanza();

S(C1);

} Si No si (pos == posC2){

W(C2);

Recibe_mensajes_pos_sig();

avanza();

S(C2);

}Si no{

Si (pos == pos_cruce){

W(Cruce);

}

Recibe_mensajes_posicion_sig();

avanza();

}

Si (sales_del_cruce){

S(Cruce);

}

Si (pos_anterior_válida){

Envia_mensajes_pos_anterior();

}

actualiza_pos_anterior();

}

Peatón

W(Nacer);

Nace();

Recibe_mensaje_pos_nac();

Mientras(posición_válida){

Mueve_peatón();

Mueve_peatón();

Pausa();

}

Fin_peatón();

Envía_mensaje_última_pos();

Muerte_hijo();

Mueve_peatón

Si (sale_zona_nacimiento){

S(Nacer);

}

Recibe_mensaje_pos_sig();

Si (pos == posP1){

W(P1);

Muevete();

S(P1);

} Si no Si(pos == posP2){

W(P2);

Muevete();

S(P2);

} Si no{

Muevete();

}

Si (anterior_válido){

Envía_mensaje_pos_anterior();

}

Actualiza_anterior();


Código


#include "cruce.h"

#include

#include

#include

#include

#include

#include

#include

#include


#define EXERR 1


//#define _HPUX

#define _PEAT

#define _SEMA

#define _COCH

#define _MSGS


void morir(int sennal);

void terminar(int sennal);

void exhortizar(int sennal);

int nace_hijo();

void muerte_peat();

void muerte_coch();

void muerte_hijo();

void ciclo_semaforico();

void coche();

int pos_valida(struct posiciOn);

void peaton();

void error();


int semaforo = -1, mcomp = -1, buzon = -1;

int ppid;

char * pmem = NULL;

int max_proc;


#ifndef _HPUX

union semun{

int val;

struct semid_ds *buf;

ushort_t *array;

};

#endif


typedef struct mensaje{

long tipo;

char info;

} mensaje;


int main(int argc, char * argv[]){

struct sigaction manejadora;

struct sembuf procesos[1];

#ifndef _HPUX

union semun sem;

#endif

int vel, tipo;

int i, j;

long tipomen;

mensaje msg;


if(argc != 3){

printf("Error en el paso de argumentos.\n");

return 1;

}

max_proc = atoi(argv[1]);

vel = atoi(argv[2]);

ppid = getpid();


manejadora.sa_handler = morir;

if(sigfillset(&manejadora.sa_mask) == -1) return EXERR;

manejadora.sa_flags = 0;

if(sigaction(SIGINT, &manejadora, NULL) == -1)return EXERR;

manejadora.sa_handler = terminar;

if(sigemptyset(&manejadora.sa_mask) == -1)return EXERR;

manejadora.sa_flags = 0;

if(sigaction(SIGTERM, &manejadora, NULL) == -1)return EXERR;

if(signal(SIGCHLD, SIG_IGN) == SIG_ERR)return EXERR;


semaforo = semget(IPC_PRIVATE, 9, IPC_CREAT|0600);

if(semaforo == -1) error();

mcomp = shmget(IPC_PRIVATE, 256, IPC_CREAT|0600);

if(mcomp == -1)error();

pmem = (char *)shmat(mcomp, NULL, 0);

if(pmem == NULL) error();

buzon = msgget(IPC_PRIVATE, IPC_CREAT|0600);

if(buzon == -1) error();

#ifndef _HPUX

sem.val = max_proc-1;

if(semctl(semaforo, 1, SETVAL, sem) == -1)error();

sem.val = 0;

if(semctl(semaforo, 2, SETVAL, sem) == -1)error();

sem.val = 0;

if(semctl(semaforo, 3, SETVAL, sem) == -1)error();

sem.val = 1;

if(semctl(semaforo, 4, SETVAL, sem) == -1)error();

sem.val = 0;

if(semctl(semaforo, 5, SETVAL, sem) == -1)error();

sem.val = 1;

if(semctl(semaforo, 6, SETVAL, sem) == -1)error();

sem.val = 1;

if(semctl(semaforo, 7, SETVAL, sem) == -1)error();

#else

if(semctl(semaforo, 1, SETVAL, max_proc-1) == -1)error();

if(semctl(semaforo, 2, SETVAL, 0) == -1)error();//Semáforos C1

if(semctl(semaforo, 3, SETVAL, 0) == -1)error(); //C2

if(semctl(semaforo, 4, SETVAL, 1) == -1)error(); //P1

if(semctl(semaforo, 5, SETVAL, 0) == -1)error(); //P2 según como estarían al acabar la ultima fase

if(semctl(semaforo, 6, SETVAL, 1) == -1)error(); //CRUCE

if(semctl(semaforo, 7, SETVAL, 1) == -1)error(); //NACE

#endif


for(i = 0; i <= 16; i++){

for(j = 0; j <= 50; j++){

msg.tipo = 1 + i*100 + j;

msg.info = 'v';

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1)error();

}

}


procesos[0].sem_num = 1;

procesos[0].sem_op = -1;

procesos[0].sem_flg = 0;


CRUCE_inicio(vel, max_proc, semaforo, pmem);

#ifdef _SEMA

if(semop(semaforo, procesos, 1) == -1)error();

switch(nace_hijo()){

case 0:

ciclo_semaforico();

return 1;

}

#endif

while(1){

if(semop(semaforo, procesos, 1) == -1)kill(0, SIGTERM);

tipo = CRUCE_nuevo_proceso();

switch(nace_hijo()){

case 0:

switch (tipo){

#ifdef _COCH

case COCHE:

coche();

#endif


#ifdef _PEAT

case PEAToN:

peaton();

#endif

default:

muerte_hijo();

}

default:

break;

}

}

}


void error(){

struct shmid_ds buf;

if(semaforo != -1) semctl(semaforo, 0, IPC_RMID);

if(mcomp != -1){

shmdt(pmem);

shmctl(mcomp, IPC_RMID, &buf);

}

if(buzon != -1) msgctl(buzon, IPC_RMID, NULL);

_Exit(EXERR);

}


void morir(int sennal){

struct sembuf sem[1];

struct shmid_ds buf;

sem[0].sem_flg = 0;

if(getpid() == ppid){

CRUCE_fin();

sem[0].sem_num = 1;

sem[0].sem_op = -(max_proc - 2);

if(semop(semaforo, sem, 1) == -1) kill(0, SIGTERM);

if(semaforo != -1) if(semctl(semaforo, 0, IPC_RMID) == -1) kill(0, SIGTERM);

if(mcomp != -1){

if(shmdt(pmem) == -1) kill(0, SIGTERM);

if(shmctl(mcomp, IPC_RMID, &buf) == -1) kill(0, SIGTERM);

}

if(buzon != -1) if(msgctl(buzon, IPC_RMID, NULL) == -1) kill(0, SIGTERM);

}

else{

muerte_hijo();

}

_Exit(0);

}


void terminar(int sennal){

struct shmid_ds buf;

if(getpid() == ppid){

CRUCE_fin();

if(semaforo != -1) semctl(semaforo, 0, IPC_RMID);

if(mcomp != -1){

shmdt(pmem);

shmctl(mcomp, IPC_RMID, &buf);

}

if(buzon != -1) msgctl(buzon, IPC_RMID, NULL);

}

else{

muerte_hijo();

}

_Exit(EXERR);

}


void muerte_hijo(){

struct sembuf procesos[1];

procesos[0].sem_num = 1;

procesos[0].sem_op = 1;

procesos[0].sem_flg = 0;

if(semop(semaforo, procesos, 1))kill(0, SIGTERM);

_Exit(0);

}


int nace_hijo(){

int pid;

if(ppid == getpid()){

pid = fork();

switch(pid){

case -1:

kill(0, SIGTERM);

break;

case 0:

return 0;

default:

return pid;

}

}

}


void ciclo_semaforico(){

struct sembuf pon_sem[3];

pon_sem[0].sem_flg = 0;

pon_sem[1].sem_flg = 0;

pon_sem[2].sem_flg = 0;


CRUCE_pon_semAforo(SEM_C2, ROJO);

while(1){

pon_sem[0].sem_num = 4;

pon_sem[0].sem_op = -1; //P1

if(semop(semaforo, pon_sem, 1))kill(0, SIGTERM);

CRUCE_pon_semAforo(SEM_P1, ROJO);

pon_sem[0].sem_num = 2;

pon_sem[0].sem_op = 1;//C1

pon_sem[1].sem_num = 5;

pon_sem[1].sem_op = 1; //P2

CRUCE_pon_semAforo(SEM_C1, VERDE);

CRUCE_pon_semAforo(SEM_P2, VERDE);

if(semop(semaforo, pon_sem, 2))kill(0, SIGTERM);

pausa();

pausa();

pausa();

pausa();

pausa();

pausa();

pon_sem[0].sem_num = 2;

pon_sem[0].sem_op = -1;//C1

pon_sem[1].sem_num = 5;

pon_sem[1].sem_op = -1; //P2

if(semop(semaforo, pon_sem, 2))kill(0, SIGTERM);

CRUCE_pon_semAforo(SEM_C1, AMARILLO);

CRUCE_pon_semAforo(SEM_P2, ROJO);

pausa();

pausa();

pon_sem[0].sem_num = 6; //CRUCE

pon_sem[0].sem_op = -1;

if(semop(semaforo, pon_sem, 1))kill(0, SIGTERM);

CRUCE_pon_semAforo(SEM_C1, ROJO);

pon_sem[0].sem_op = 1;

if(semop(semaforo, pon_sem, 1))kill(0, SIGTERM);


CRUCE_pon_semAforo(SEM_C2, VERDE);

pon_sem[0].sem_num = 3; //C2

pon_sem[0].sem_op = 1;

if(semop(semaforo, pon_sem, 1))kill(0, SIGTERM);

pausa();

pausa();

pausa();

pausa();

pausa();

pausa();

pausa();

pausa();

pon_sem[0].sem_num = 3;

pon_sem[0].sem_op = -1;//C2

if(semop(semaforo, pon_sem, 1))kill(0, SIGTERM);

CRUCE_pon_semAforo(SEM_C2, AMARILLO);

pausa();

pausa();

pon_sem[0].sem_num = 6;

pon_sem[0].sem_op = -1;

if(semop(semaforo, pon_sem, 1))kill(0, SIGTERM);

CRUCE_pon_semAforo(SEM_C2, ROJO);


pon_sem[0].sem_op = 1; //amar

if(semop(semaforo, pon_sem, 1))kill(0, SIGTERM);


CRUCE_pon_semAforo(SEM_P1, VERDE);

pon_sem[0].sem_num = 4; //P1

pon_sem[0].sem_op = 1;

if(semop(semaforo, pon_sem, 1))kill(0, SIGTERM);

pausa();

pausa();

pausa();

pausa();

pausa();

pausa();

}

}


struct posiciOn mueve_coche(struct posiciOn pos, struct posiciOn * anterior){

struct sembuf procesos[1], semc1[2], semc2[2], amarillo[1];

struct mensaje msg, msg_ant;

long tipo;

struct posiciOn sig;

semc1[0].sem_num = 2;

semc1[0].sem_op = -1;

semc1[0].sem_flg = 0;

semc2[0].sem_num = 3;

semc2[0].sem_op = -1;

semc2[0].sem_flg = 0;

semc2[1].sem_num = 6; //CRUCE

semc2[1].sem_op = -1;

semc2[1].sem_flg = 0;

semc1[1].sem_num = 6; //CRUCE

semc1[1].sem_op = -1;

semc1[1].sem_flg = 0;

amarillo[0].sem_num = 6;

amarillo[0].sem_op = -1;

amarillo[0].sem_flg = 0;

#ifdef _SEMA

if((pos.y == 6) && (pos.x == 33)){

if(semop(semaforo, semc1, 2))kill(0, SIGTERM);

#ifdef _MSGS

tipo = 1 + pos.y*100 + (pos.x);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + pos.y*100 + (pos.x + 1);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + pos.y*100 + (pos.x + 2);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + pos.y*100 + (pos.x + 3);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + pos.y*100 + (pos.x + 4);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

#endif

sig = CRUCE_avanzar_coche(pos);

semc1[0].sem_op = 1;

if(semop(semaforo, semc1, 1))kill(0, SIGTERM);

}

else if((pos.y == 10) && (pos.x == 13)){

if(semop(semaforo, semc2, 1))kill(0, SIGTERM);

#ifdef _MSGS

tipo = 1 + (pos.y)*100 + (pos.x + 5);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y-1)*100 + (pos.x + 5);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y-2)*100 + (pos.x + 5);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y)*100 + (pos.x + 6);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y-1)*100 + (pos.x + 6);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y-2)*100 + (pos.x + 6);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

#endif

sig = CRUCE_avanzar_coche(pos);

semc2[0].sem_op = 1;

if(semop(semaforo, semc2, 1))kill(0, SIGTERM);

}else{

#ifdef _MSGS

if (pos.x == 33 && pos.y == 6){

amarillo[0].sem_num = 6;

amarillo[0].sem_op = -1;

if(semop(semaforo, amarillo, 1))kill(0, SIGTERM);

} else if(pos.x == 23 && pos.y == 10){

amarillo[0].sem_num = 6;

amarillo[0].sem_op = -1;

if(semop(semaforo, amarillo, 1))kill(0, SIGTERM);

}

if(pos.x == 33 && pos.y == 10 && anterior->y == 10 && anterior->x == 31){

tipo = 1 + (pos.y + 1)*100 + (pos.x);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y + 1)*100 + (pos.x + 1);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y + 1)*100 + (pos.x + 2);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y + 1)*100 + (pos.x + 3);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y + 1)*100 + (pos.x + 4);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

}

else if(pos.x < y ="="">

tipo = 1 + (pos.y)*100 + (pos.x + 5);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y-1)*100 + (pos.x + 5);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y-2)*100 + (pos.x + 5);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y)*100 + (pos.x + 6);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y-1)*100 + (pos.x + 6);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + (pos.y-2)*100 + (pos.x + 6);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

}

else if(pos.y <= 16 ){

tipo = 1 + pos.y*100 + (pos.x);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + pos.y*100 + (pos.x + 1);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + pos.y*100 + (pos.x + 2);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + pos.y*100 + (pos.x + 3);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

tipo = 1 + pos.y*100 + (pos.x + 4);

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

}

#endif

sig = CRUCE_avanzar_coche(pos);

}

#else

sig = CRUCE_avanzar_coche(pos);

#endif


if(pos.x == 33 && pos.y == 13){

amarillo[0].sem_op = 1;

if(semop(semaforo, amarillo, 1) == -1) kill(0, SIGTERM);

}

if((anterior->x != -1) && (anterior->y != -1)){

if(pos.x == 33 && pos.y == 10 && anterior->y == 10 && anterior->x == 31){

msg.tipo = 1 + (anterior->y - 2)*100 + (anterior->x);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 1)*100 + (anterior->x);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y)*100 + (anterior->x);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 2)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 1)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

}

else if(anterior->x <= 31 && anterior->x == 1){

msg.tipo = 1 + (anterior->y - 2)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 1)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

}

else if(anterior->x <= 31 && anterior->x >= 3){

msg.tipo = 1 + (anterior->y - 2)*100 + (anterior->x);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 1)*100 + (anterior->x);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y)*100 + (anterior->x);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 2)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 1)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

}

else if (pos.x == 33 && pos.y == 12 && anterior->y == 10 && anterior->x == 33);

else if (anterior->y > 4 && anterior->x >31 && pos.y <>

msg.tipo = 1 + (anterior->y - 4)*100 + (anterior->x + 4);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 4)*100 + (anterior->x + 3);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 4)*100 + (anterior->x + 2);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 4)*100 + (anterior->x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior->y - 4)*100 + (anterior->x);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

}

}

if (pos.x == 33 && pos.y == 10 && anterior->y == 10 && anterior->x == 31){

anterior->x = 33;

anterior->y = 10;

}else{

anterior->x = pos.x;

anterior->y = pos.y;

}

return sig;

}


void coche(){

struct sembuf procesos[1];

struct posiciOn pos, anterior = {-1, -1};

struct mensaje msg;

procesos[0].sem_num = 1;

procesos[0].sem_op = 1;

procesos[0].sem_flg = 0;

pos = CRUCE_inicio_coche();

while(1){

pos = mueve_coche(pos, &anterior);

if(!pos_valida(pos)) break;

pausa();

}

CRUCE_fin_coche();

msg.tipo = 1 + (anterior.y - 4)*100 + (anterior.x + 4);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior.y - 4)*100 + (anterior.x + 3);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior.y - 4)*100 + (anterior.x + 2);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior.y - 4)*100 + (anterior.x + 1);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

msg.tipo = 1 + (anterior.y - 4)*100 + (anterior.x);

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

muerte_hijo();

}


int pos_valida(struct posiciOn pos){

if(pos.y <>

else return 1;

}


struct posiciOn mueve_peaton(struct posiciOn pos, struct posiciOn * anterior){

struct posiciOn sig;

struct sembuf semp2[1], semp1[1], semnac[1];

struct mensaje msg, msg_ant;

static int critica = 1;

long tipo;

semp2[0].sem_num = 5;

semp2[0].sem_flg = 0;

semp2[0].sem_op = -1;

semp1[0].sem_num = 4;

semp1[0].sem_flg = 0;

semp1[0].sem_op = -1;

semnac[0].sem_num = 7;

semnac[0].sem_flg = 0;

semnac[0].sem_op = -1;


tipo = 1 + pos.x + pos.y*100;

if(((anterior->y == 16 && anterior->x <>x == 0 && anterior->y <= 16 && anterior->y > 11)) && (critica == 0)){

semnac[0].sem_op = -1;

if(semop(semaforo, semnac, 1) == -1) kill(0, SIGTERM);

critica = 1;

} else if ((anterior->y <= 15 && (anterior->x > 0)) && (critica == 1)){

semnac[0].sem_op = 1;

if(semop(semaforo, semnac, 1) == -1) kill(0, SIGTERM);

critica = 0;

}

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

#ifdef _SEMA

if((pos.x <> 20) && (pos.y == 11)){

if(semop(semaforo, semp2, 1) == -1) kill(0, SIGTERM);

sig = CRUCE_avanzar_peatOn(pos);

semp2[0].sem_op = 1;

if(semop(semaforo, semp2, 1) == -1) kill(0, SIGTERM);

}

else if((pos.y <> 12) && (pos.x == 30)){

if(semop(semaforo, semp1, 1) == -1) kill(0, SIGTERM);

sig = CRUCE_avanzar_peatOn(pos);

semp1[0].sem_op = 1;

if(semop(semaforo, semp1, 1) == -1) kill(0, SIGTERM);

}

else sig = CRUCE_avanzar_peatOn(pos);

#else

sig = CRUCE_avanzar_peatOn(pos);

#endif

if((anterior->x != -1) && (anterior->y != -1)){

msg_ant.tipo = 1 + anterior->x + anterior->y*100;

if(msgsnd(buzon, &msg_ant, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

}

anterior->x = pos.x;

anterior->y = pos.y;

return sig;

}


void peaton(){

struct sembuf procesos[1], semnac[1];

struct posiciOn pos, anterior = {-1, -1};

struct mensaje msg;

long tipo;

procesos[0].sem_num = 1;

procesos[0].sem_op = 1;

procesos[0].sem_flg = 0;

semnac[0].sem_num = 7;

semnac[0].sem_op = -1;

semnac[0].sem_flg = 0;

if(semop(semaforo, semnac, 1) == -1) kill(0, SIGTERM);

pos = CRUCE_inicio_peatOn_ext(&anterior);

tipo = 1 + anterior.y*100 + anterior.x;

if(msgrcv(buzon, &msg, sizeof(mensaje), tipo, MSG_NOERROR) == -1) kill(0, SIGTERM);

while(1){

pos = mueve_peaton(pos, &anterior);

if(!pos_valida(pos)) break;

pos = mueve_peaton(pos, &anterior);

if(!pos_valida(pos)) break;

pausa();

}

msg.tipo = 1 + anterior.x + anterior.y*100;

msg.info = 'v';

CRUCE_fin_peatOn();

if(msgsnd(buzon, &msg, sizeof(mensaje) - sizeof(long), 0) == -1) kill(0, SIGTERM);

muerte_hijo();

}