Потоковая передача вывода 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
и все, что я мог найти.Где я неправ?Сама команда в порядке, на оболочке тоже работает, и execvp
вызов не выдает ошибку.
Решение
Оказывается, приведенный выше код верен.Проблема заключалась в неправильном использовании более раннего strtok
что привело к тихому падению strdup
.А fork
выше просто никогда не выполнялся, и все мои тесты были выше strtok
линия.Только после того, как поставил printf
s в каждую строку кода, я смог найти проблему.
Честно говоря, я чувствую себя глупо.