Изменить дескриптор файла на канал STDOUT на сокет? - PullRequest
2 голосов
/ 04 апреля 2011

У меня открыт сокет, который соединяет клиента и сервер.

Я реализую удаленное выполнение, и поэтому я хочу изменить таблицу дескрипторов файлов таким образом, чтобы вызовы, которые обычно переходили наstdout, на самом деле перейдите через сокет для вывода на клиенте.

Сейчас у меня есть серверная вилка, а затем используйте команду system () для выполнения любой команды.

Что янужно сделать, чтобы управлять таблицей дескрипторов файлов?

Вот код, с которым я работаю:

Я использую select.Я использую сокет, возвращаемый вызовом accept (все это на стороне сервера).

            dup2(S,1);

            int retval = fork();
            if (retval > 1)
            {
            system(receive.text);
            return 0;
            }

Теперь результатом этого является то, что на сервер не выводится текст (так что он явно не подключен к stdout сервера), но на клиенте ничего не отображается).

Нужно ли делать что-то еще на стороне клиента, чтобы получить это (например, вызов recv ()?), И я использую правильный сокет?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 04 апреля 2011

Обычный механизм: dup2(2):

#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

Вызов dup(2) дублирует данный файловый дескриптор для открытого файлового дескриптора с наименьшим номером.Это был исторический механизм, все еще работает, но он не позволяет легко указывать номера файловых дескрипторов.Итак, dup2(2) был введен для указания обоих файловых дескрипторов.

Вы можете использовать его так:

int s = /* connect() or accept() */
int ret = dup2(s, 1);
/* exec() */
0 голосов
/ 04 апреля 2011

Проблема в том, что system просто сохраняет дескрипторы файлов родителя, поэтому он не может работать так, как вы хотите. Вы могли бы использовать popen, но это ужасно. Вы действительно должны написать код fork и exec самостоятельно. system почти всегда ошибка.

...