我知道这个问题已被问过十亿次,但所有解决方案都不适合我。我需要通过套接字将stdout
的{{1}}流式传输到客户端。相关的客户端代码是
execvp
我试图在this question上复制答案。但是,当我尝试这段代码时,我什么也得不回来:
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);
}
}
我三重检查连接是否正确建立。当我用简单的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);
替换execute_cmd
时,客户端会正确打印答案。但是当我执行上面的代码时没有任何反应,我没有得到任何字节。我已移除了write
来电并且未获得dup2
来电的输出。
在这里非常绝望,尝试了execvp
以及我能找到的任何东西。我哪里做错了?命令本身也可以,在shell上工作,pipe
调用不会抛出错误。
答案 0 :(得分:0)
原来上面的代码是正确的。问题是错误地使用了早先的strtok
导致了strdup
的无声崩溃。上面的fork
根本就没有执行过,我的所有测试都在strtok
行以上。只有在将printf
放入代码的每一行后,我才能找到问题。