2011-11-10 8 views
5

Ho creato un programma shell distribuito con client e server. Il client invia una richiesta di comando al server e il server esegue quel comando localmente e dovrebbe inviare i risultati di tale comando al client. Non riesco a capire come reindirizzare stdout/stderr sul client. Io uso execvp per eseguire il comando.Reindirizzamento stdout e stderr al socket per un programma shell distribuito

Penso che potrei dover usare dup2? Ma non riesco a capire come usarlo correttamente. Qualsiasi aiuto?

risposta

7

È sufficiente utilizzare dup2() per duplicare il descrittore di file del socket sui descrittori di file stderr e stdout. È praticamente la stessa cosa che reindirizzare alle pipe.

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

Così ho provato questo metodo ma nessun output si presenta sul lato client. Ma al posto di sockfd, ho appena messo la variabile del mio socket. Suppongo che non sia il vero descrittore di file del socket? Come faccio a sapere che cosa è il descrittore di file del socket? – y3di

+0

Il descrittore del file socket (sul server) è quello restituito da 'accept()' - lo stesso da leggere/scrivere su/da se non si utilizza 'fork()'/'execvp() '. Se quello è quello che stai usando, potrebbe esserci un altro problema con il tuo codice. – Dmitri

+0

c'è qualche codice che dovrei fare sul lato client per far passare l'output? Devo fare un read() o qualcosa del genere [come se il server stesse scrivendo qualcosa su quella porta] – y3di

Problemi correlati