通过套接字流式传输execvp

时间:2014-06-03 11:25:57

标签: c sockets exec pipe dup

我知道这个问题已被问过十亿次,但所有解决方案都不适合我。我需要通过套接字将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调用不会抛出错误。

1 个答案:

答案 0 :(得分:0)

原来上面的代码是正确的。问题是错误地使用了早先的strtok导致了strdup的无声崩溃。上面的fork根本就没有执行过,我的所有测试都在strtok行以上。只有在将printf放入代码的每一行后,我才能找到问题。

坦率地说,我感到愚蠢。