2011-11-10 9 views
5

Hice un programa de shell distribuido que tiene un cliente y servidor. El cliente envía una solicitud de comando al servidor y el servidor ejecuta ese comando localmente y se supone que debe enviar los resultados de ese comando al cliente. Tengo problemas para descubrir cómo redirigir stdout/stderr al cliente. Yo uso execvp para ejecutar el comando.Redirigir stdout y stderr a socket para un programa de shell distribuido

Creo que podría tener que usar dup2? Pero no puedo descifrar cómo usarlo correctamente. ¿Alguna ayuda?

Respuesta

7

Solo tiene que utilizar dup2() para duplicar el descriptor de archivo del zócalo en los descriptores de los archivos stderr y stdout. Es más o menos lo mismo que redirigir a las tuberías.

cpid = fork(); 
if (cpid == 0) { 
    dup2(sockfd, STDOUT_FILENO); 
    dup2(sockfd, STDERR_FILENO); 
    execvp(...); 
    /*... etc. etc. */ 
+0

Así que probé este método pero no aparece ninguna salida en el lado del cliente. Pero en lugar de sockfd, acabo de poner la variable de mi socket. Supongo que ese no es el descriptor de archivo real del socket. ¿Cómo puedo averiguar cuál es el descriptor de archivo del socket? – y3di

+0

El descriptor de archivo de socket (en el servidor) es el que devuelve 'accept()' - el mismo que leería/escribiría en/from si no estaba usando 'fork()'/'execvp() '. Si ese es el que estás usando, puede haber un problema diferente con tu código. – Dmitri

+0

¿Hay algún código que debería estar haciendo en el lado del cliente para que salga la salida? ¿Debo hacer una lectura() o algo por el estilo [como si el servidor estuviera escribiendo algo en ese puerto] – y3di

Cuestiones relacionadas