2017-02-19 2 views
-1

Я использую системный вызов socketpair() для IPC и возвращает 0,1 или 2 дескриптора файла, если они доступны. Используя системный вызов write() для записи fd 0 в STDIN, тем самым испортил вывод моего приложения. Есть ли что-то, что я могу сделать, чтобы предотвратить сокет() от возврата 0,1 или 2 как fd?Как предотвратить системный вызов socket() от возвращаемого дескриптора файла 0,1 или 2?

+2

Использование 'write()' для записи FD 0 на любой, к которому подключено 0. Если это сокет, это не 'stdin', и он не может« испортить вывод вашего приложения ». Непонятно, что у вас есть проблема для решения. – EJP

+1

Возвращаемое значение из socketpair ** не ** файловый дескриптор, это код состояния (-1 или 0), что означает отказ или успех. – wildplasser

+0

Неплохо, я хотел сказать, что сокету присвоен дескриптор файла 0,1 или 2. –

ответ

1

Не закрывайте стандартный ввод, стандартный выход или стандартную ошибку перед использованием socketpair(). При необходимости откройте /dev/null для этих файловых дескрипторов.

Когда дескрипторы выделяются (любым системным вызовом - open(), socket(), socketpair(), accept(), pipe(), dup() и т.д.), номер, используемый всегда низкая цена доступна (Unopen) номер. Если вы получаете 0, 1 или 2, выделенные socketpair(), это означает, что вы должны были закрыть соответствующий дескриптор, но почему вы это сделали? Неважно; не делай этого.

Или закрепите его, открыв /dev/null. Помните, что 0 должно быть читаемым, а 1 и 2 должны быть доступны для записи (и что не имеет значения, является ли 0 доступным для записи и 1 и 2 являются читаемыми, и действительно, когда оболочка запускается в терминале, все три часто читаются и доступен для записи).

+0

Вы правы, я никогда не закрывал STD *. Проблема была где-то в другом месте. –