Вопрос

Я знаю, что этот вопрос задавался миллиард раз, но мне не все решения помогли.мне нужно транслировать 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 и все, что я мог найти.Где я неправ?Сама команда в порядке, на оболочке тоже работает, и execvp вызов не выдает ошибку.

Это было полезно?

Решение

Оказывается, приведенный выше код верен.Проблема заключалась в неправильном использовании более раннего strtok что привело к тихому падению strdupfork выше просто никогда не выполнялся, и все мои тесты были выше strtok линия.Только после того, как поставил printfs в каждую строку кода, я смог найти проблему.

Честно говоря, я чувствую себя глупо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top