2

我知道这个问题已经被问了十亿次,但是所有的解决方案都对我不起作用。我需要通过套接字将一个流式传输到客户端stdoutexecvp相关的客户代码是这样的

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用 simple替换时write,客户端会正确打印答案。但是当我执行上面的代码时没有任何反应,我没有得到任何字节。我已删除dup2呼叫,但没有得到任何输出execvp

在这里变得非常绝望,尝试了pipe我能找到的任何东西。我哪里做错了?该命令本身也可以,可以在 shell 上运行,并且execvp调用不会引发错误。

4

1 回答 1

0

原来上面的代码是正确的。问题是不正确使用较早版本strtok导致strdup. 以上fork根本没有执行,我所有的测试都在这strtok条线之上。只有在将printfs 放入代码的每一行之后,我才能找到问题所在。

坦率地说,我觉得自己很愚蠢。

于 2014-06-05T09:56:26.840 回答