Streaming Execvp Output tramite presa
Domanda
So che questa domanda è stato chiesto un miliardo di volte, ma tutte le soluzioni non funzionano per me. Ho bisogno di streaming del stdout
di un execvp
tramite un socket su un client. Il codice cliente rilevante è questo
static void execute_cmd(int fd, char *cmd, char **params) {
pid_t cid;
size_t i = 0, c = 0;
cid = fork();
if(cid == 0) {
close(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
if(execvp(cmd, params) < 0) {
fprintf(stderr, "Could not execute \"%s\": %d\n", cmd, errno);
exit(1);
}
} else {
close(fd);
waitpid(cid, NULL, 0);
exit(1);
}
}
.
Ho provato a copiare la risposta su Questa domanda . Tuttavia, non ricevo nulla quando provo questo codice:
int sockfd = serverConnect();
write(sockfd, "echo math", 11);
n = read(sockfd, buffer, 1023);
printf("Got %d bytes\n", n);
printf("%s\n", buffer);
close(sockfd);
.
I TRIPLE ha controllato che la connessione sia stabilita correttamente. Quando sostituisco execute_cmd
con un semplice write
, il client stampa correttamente la risposta. Ma non succede nulla quando eseguo il codice sopra, non ottengo byte indietro. Ho rimosso la chiamata dup2
e non ho ricevuto alcuna uscita dalla chiamata execvp
.
Abbastanza disperato qui, provato pipe
e qualunque cosa potessi trovare. Dove ho sbagliato? Anche il comando stesso è OK funziona sulla shell e la chiamata execvp
non getta un errore.
Soluzione
Risulta il codice sopra è corretto.Il problema era un uso errato di un strtok
precedente che ha portato a un incidente silenzioso di strdup
.Il fork
sopra non è stato semplicemente mai eseguito, e tutti i miei test erano sopra la linea strtok
.Solo dopo aver messo printf
s in ogni riga del codice che ho trovato il problema.
Francamente, mi sento stupido.