Streaming execvp de saída através de socket
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.
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 printf
s em cada linha do código que eu poderia encontrar o problema.
Francamente, sinto-me estúpido.