Pregunta

Sé que esta pregunta se ha hecho millones de veces, pero todas las soluciones no están funcionando para mí.Necesito para el flujo de stdout de un execvp a través de un socket a un cliente.El cliente relevante código es este

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

He intentado copiar la respuesta en esta pregunta.Sin embargo, me sale nada cuando me pruebe este código:

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

Yo el triple para comprobar que la conexión se ha establecido correctamente.Cuando puedo reemplazar execute_cmd con un simple write, el cliente imprime correctamente la respuesta.Pero nada sucede al ejecutar el código anterior, no tengo bytes de la espalda.Me han quitado el dup2 llame y no obtuve resultado de la execvp llamar a cualquiera.

Bastante desesperado aquí, trató de pipe y lo que me podría encontrar.¿De dónde me salen mal?El comando en sí está bien, también, obras en la concha, y el execvp la llamada no se lanza un error.

¿Fue útil?

Solución

Resulta que el código anterior es correcto.El problema era el uso incorrecto de un anterior strtok que resultó en un silencio accidente de strdup.El fork anteriormente fue simplemente nunca se ejecuta, y todas mis pruebas por encima de la strtok de la línea.Sólo después de poner printfs en cada línea del código, pude encontrar el problema.

Francamente, me siento estúpido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top