我知道这个问题已经被问了十亿次,但所有的解决方案都不适合我。我需要流 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 行。只有在把 printfs到代码的每一行,我可以找到问题。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top