Streaming der execvp-Ausgabe über Socket
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.
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 printf
s in jede Zeile des Codes konnte ich das Problem finden.
Ehrlich gesagt, ich fühle mich dumm.