Sortie en streaming execvp via socket
Question
Je sais que cette question a été posée un milliard de fois, mais toutes les solutions ne fonctionnent pas pour moi.J'ai besoin de diffuser le stdout
d'un execvp
via une socket vers un client.Le code client pertinent est le suivant
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);
}
}
J'ai essayé de copier la réponse sur cette question.Cependant, je n'obtiens rien lorsque j'essaie ce code :
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);
J'ai vérifié trois fois que la connexion est établie correctement.Quand je remplace execute_cmd
avec un simple write
, le client imprime correctement la réponse.Mais rien ne se passe lorsque j'exécute le code ci-dessus, je ne récupère aucun octet.J'ai supprimé le dup2
appel et je n'ai reçu aucune réponse du execvp
appelle non plus.
Je suis assez désespéré ici, j'ai essayé pipe
et tout ce que je pourrais trouver.Où est-ce que je me suis trompé?La commande elle-même est également correcte, elle fonctionne sur le shell et le execvp
l'appel ne génère pas d'erreur.
La solution
Il s'avère que le code ci-dessus est correct.Le problème était une utilisation incorrecte d'un ancien strtok
qui a entraîné un crash silencieux de strdup
.Le fork
ci-dessus n'a tout simplement jamais été exécuté, et tous mes tests étaient au-dessus du strtok
doubler.Seulement après avoir mis printf
s dans chaque ligne du code, j'ai pu trouver le problème.
Franchement, je me sens stupide.