Pergunta

Eu sei que esta pergunta foi feita a um bilhão de vezes, mas todas as soluções não estão funcionando para mim.Eu precisa para transmitir o stdout de um execvp através de um soquete para um cliente.O relevante cliente código é 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);
    }
}

Eu tentei copiar a resposta esta pergunta.No entanto, recebo nada de volta quando eu tentar 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);

Eu triplo do verificado que a conexão é estabelecida corretamente.Quando eu substituir execute_cmd com um simples write, o cliente imprime corretamente a resposta.Mas não acontece nada quando eu executar o código acima, eu não recebo bytes de volta.Eu ter removido o dup2 chamada e não tem saída execvp chamar qualquer um.

Ficando bastante desesperado aqui, tentei pipe e o que eu poderia encontrar.Onde foi que erramos?O comando em si é ok, também, trabalha na shell, e o execvp chamada não lançar um erro.

Foi útil?

Solução

Acontece que o código acima está correto.O problema foi um uso incorreto de uma anterior strtok o que resultou em um silêncio de falha de strdup.O fork acima foi simplesmente nunca executado, e todos os meus testes foram acima do strtok linha.Só depois de colocar printfs em cada linha do código que eu poderia encontrar o problema.

Francamente, sinto-me estúpido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top