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.

Était-ce utile?

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 printfs dans chaque ligne du code, j'ai pu trouver le problème.

Franchement, je me sens stupide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top