通过套接字流式传输execvp输出
题
我知道这个问题已经被问了十亿次,但所有的解决方案都不适合我。我需要流 stdout
一个 execvp
通过套接字到客户端。相关的客户端代码是这样的
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
要么打电话。
在这里变得非常绝望,尝试过 pipe
不管我能找到什么。我哪里出错了?命令本身也可以,在shell上工作,并且 execvp
调用不会引发错误。
解决方案
原来上面的代码是正确的。问题是错误地使用了早期的 strtok
这导致了一场无声的崩溃。 strdup
.该 fork
上面根本就没有执行,我所有的测试都在上面。 strtok
行。只有在把 printf
s到代码的每一行,我可以找到问题。
坦率地说,我觉得很愚蠢。
不隶属于 StackOverflow