Estoy realizando una especie de juego al estilo 7 y media (o black jack), donde hay un programa repartidor.c y otro que se llama jugador.c. En principio funciona pasando el parámetro de numero de jugadores al repartidor, y este mediante fork() va creado procesos hijos los cuales realizan la partida y van mostrando concurrentemente con el proceso padre los resultados intermedios. Hay un momento en el que los jugadores se van plantando y mediante exit() indican al proceso padre que han concluido (con un wait()), hasta aqui lo tengo hecho, pero ahora lo que deberia hacer es poner al final de todo una linea indicando que jugador ha ganado y con cuanta puntuación (pid del hijo y resultado interno del programa jugador). Básicamente creo que cuando leo proceso y puntos obtenidos tendria que meterlo en algun lugar para luego compararlos todos y sacar el ganado.... pero ni idea, llevo bloqueado dias. Alguna idea? Pongo el código que tengo hasta el momento para que lo veais mejor (o eso espero):
Código:
int trataExitCode(int pid,int st)
{
int statcode,signcode;
char charbuffer[128];
if(WIFEXITED(st)) {
statcode=WEXITSTATUS(st);
sprintf(charbuffer, "%sEl proceso %d termina con exitcode %d%s\n",color_blue ,pid,statcode,color_end);
write(1,charbuffer,strlen(charbuffer));
return statcode;
}
else{
signcode=WTERMSIG(st);
sprintf(charbuffer,"Elproceso %d termina por el signal%d\n",pid,signcode); //aqui ya tengo pid de hijo y resultado, ahora deberia tratarlo de algun modo para que de todas las lineas que muestre al final me diga que
//proceso ha sacado la mejor puntuacion (mas cercana a 15 y en caso de empate el del pid mas bajo).
write(1,charbuffer,strlen(charbuffer));
}
}
int
main (int arc, char *arv[])
{
int i, n, st, pid;
char s[100];
char *args[] = { "jugador2", NULL };
if (arc != 2)
error ("Error: wrong arguments.");
n = atoi (arv[1]);
sprintf (s,
"\n**********Start of game (%d players, pid croupier=%d)***********\n",
n, getpid ());
if (write (1, s, strlen (s)) < 0)
error ("write");
for (i = 0; i < n; i++){
pid = fork();
if(pid == 0) { // son
execv (args[0], args);
}
if(pid > 0) { //parent
sprintf (s, "%s[%d] pid=%d created%s\n", color_blue, getpid (), pid,color_end);
if (write (1, s, strlen (s)) < 0)
error ("write");
}
}
while((pid=wait(&st))!= -1) { //aqui trata el resultado que jugador.c envie por exit()
trataExitCode(pid,st);
}
while ((pid = wait(&st)) != -1){
sprintf (s, "%s[%d] pid=%d ended%s\n", color_blue, getpid (), pid,
color_end); //aqui va mirando que procesos van acabando
if (write (1, s, strlen (s)) < 0)
error ("write");
}
sprintf (s, "\n**********End of game: all players have ended***********\n");
if (write (1, s, strlen (s)) < 0)
error ("write");
/////****** Aqui deberia sacar una linea del estilo el "El proceso xxx ha ganado cno yy puntos"
exit (0);
Mil gracias!