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.

È stato utile?

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 printfs in ogni riga del codice che ho trovato il problema.

Francamente, mi sento stupido.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top