Frage

Ich weiß, dass diese Frage eine Milliarde Mal gestellt wurde, aber bei mir funktionieren nicht alle Lösungen.Ich muss das streamen stdout von einem execvp über einen Socket zu einem Client.Der relevante Kundencode lautet wie folgt

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);
    }
}

Ich habe versucht, die Antwort auf zu kopieren diese Frage.Ich bekomme jedoch nichts zurück, wenn ich diesen Code ausprobiere:

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);

Ich habe dreimal überprüft, ob die Verbindung korrekt hergestellt ist.Wenn ich ersetze execute_cmd mit einem einfachen write, druckt der Client die Antwort korrekt aus.Aber nichts passiert, wenn ich den obigen Code ausführe, ich bekomme keine Bytes zurück.Ich habe das entfernt dup2 anruf und bekam keine Ausgabe von der execvp ruf auch nicht an.

Hier ziemlich verzweifelt zu werden, versucht pipe und was immer ich finden konnte.Wo bin ich falsch gelaufen?Der Befehl selbst ist auch in Ordnung, funktioniert auf der Shell und der execvp aufruf wirft keinen Fehler.

War es hilfreich?

Lösung

Es stellt sich heraus, dass der obige Code korrekt ist.Das Problem war eine falsche Verwendung eines früheren strtok das führte zu einem stillen Absturz von strdup.Der fork oben wurde einfach nie ausgeführt, und alle meine Tests waren über dem strtok Linie.Erst nach dem Setzen printfs in jede Zeile des Codes konnte ich das Problem finden.

Ehrlich gesagt, ich fühle mich dumm.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top