PDA

Ver la versión completa : Cómo hacer que se comuniquen dos programas?



saboteur
06/04/2009, 23:03
Estoy intentando hacer un GUI para un motor de ajedrez y me gustaría saber cómo puedo hacer para que mi programa se comunique con el motor.

El motor (toga II) muestra los mensajes por la salida estandard. Con el comando popen() puedo leer los mensajes, pero yo también se los tengo que enviar por la salida estandard. El comando cout >> no funciona, y ya no se me ocurre qué más hacer o dónde mirar.

¿Alguna idea de los expertos en C++?

Puck2099
06/04/2009, 23:05
Puedes usar sockets, incluso por UDP sin problemas, pues al no salir para fuera sabes que los paquetes van a llegar perfectamente.

EDITO: Antes de que algún purista se me eche encima, cuando dije paquetes me refería a datagramas :p

saboteur
06/04/2009, 23:23
Sí, pero lo que quiero es que se pueda utilizar cualquier motor compatible con UCI (Universal Chess Interface). Y para eso han de comunicarse por la salida estandar de C.

Me parece que lo he puesto difícil. :)

juanvvc
06/04/2009, 23:28
Pero no entiendo ¿no puedes conectar la salida estándar de un programa a la entrada estándar del otro (y viceversa)? Deberías poder sin problemas. dup() es tu amigo :)

Puck2099
06/04/2009, 23:29
Pero no entiendo ¿no puedes conectar la salida estándar de un programa a la entrada estándar del otro (y viceversa)? Deberías poder sin problemas. dup() es tu amigo :)

Hostias, es verdad, el dup (en mi caso creo que se llamaba dup2), eso es lo que usaba yo para implementar los pipes en mi práctica de la minishell de sistemas operativos...

saboteur
06/04/2009, 23:55
Pero no entiendo ¿no puedes conectar la salida estándar de un programa a la entrada estándar del otro (y viceversa)? Deberías poder sin problemas. dup() es tu amigo :)

Pues eso es precisamente lo que quiero hacer, pero no pillo cómo hacerlo con dup().
¿Tenéis algún ejemplo corto por ahí o alguna web donde lo expliquen?

juanvvc
07/04/2009, 00:31
int main(){
int f[2];

pipe(f);

if(fork()==0){
// la llamada a un programa externo
close(p[0]); close(p[1]);
dup2(f[0], 0);
dup2(f[1], 1);
// ahora se usará f[0], f[1] con entrada y salida estándar
execvp("loquesea");
perror("exec failed");
}

// el resto de tu programa: lee de f[0] y escribe en f[1]
// ¡El otro programa pensará que es la salida y entrada estándar!
}


No lo he probado y seguro que he liado los identificadores, pero la idea es algo así :)

Aiken
07/04/2009, 01:28
El comando cout >> no funciona, y ya no se me ocurre qué más hacer o dónde mirar.

retiro lo dicho.

Aiken

saboteur
07/04/2009, 09:31
Pues gracias. Cuando llegue a casa lo pruebo, y si aún tengo problemas, me pasaré otra vez por aquí llorando. ;)

darionapole
08/04/2009, 07:01
la verdad no casi nada de C++ pero sino me equiboco stdout() no era una alternativa para cout >> ?

http://www.cplusplus.com/reference/clibrary/cstdio/stdout/

BuD
08/04/2009, 08:40
Horelei [wei] Si son dos procesos independientes lo puedes hacer con pipes. Pero todo depende, si son padre e hijo con la función pipe sirve. Si no, se puede usar mknod. En tu caso, simplemente me pregunto si haces fflush(stdout); para realmente acabar enviando lo que estas apilando en el buffer. xD

gadethelast
09/04/2009, 14:57
Alguien me puede facilitar el nuevo horario
de semana santa?

Pensé que al estar en fiestas supuestamente
lo modificaron.

Gracias.


[apacigueitor]


Gade'S!

juanvvc
09/04/2009, 15:05
Alguien me puede facilitar el nuevo horario
de semana santa?

Abre todos los días de la semana, de 7 de la mañana a 10 de la noche. Pero no vayas más tarde de las 9, que no te dará tiempo a lavar y secar.