Streaming execvp de salida a través de socket
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.
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 printf
s en cada línea del código, pude encontrar el problema.
Francamente, me siento estúpido.