Я использую системный вызов socketpair() для IPC и возвращает 0,1 или 2 дескриптора файла, если они доступны. Используя системный вызов write() для записи fd 0 в STDIN, тем самым испортил вывод моего приложения. Есть ли что-то, что я могу сделать, чтобы предотвратить сокет() от возврата 0,1 или 2 как fd?Как предотвратить системный вызов socket() от возвращаемого дескриптора файла 0,1 или 2?
ответ
Не закрывайте стандартный ввод, стандартный выход или стандартную ошибку перед использованием socketpair()
. При необходимости откройте /dev/null
для этих файловых дескрипторов.
Когда дескрипторы выделяются (любым системным вызовом - open()
, socket()
, socketpair()
, accept()
, pipe()
, dup()
и т.д.), номер, используемый всегда низкая цена доступна (Unopen) номер. Если вы получаете 0, 1 или 2, выделенные socketpair()
, это означает, что вы должны были закрыть соответствующий дескриптор, но почему вы это сделали? Неважно; не делай этого.
Или закрепите его, открыв /dev/null
. Помните, что 0 должно быть читаемым, а 1 и 2 должны быть доступны для записи (и что не имеет значения, является ли 0 доступным для записи и 1 и 2 являются читаемыми, и действительно, когда оболочка запускается в терминале, все три часто читаются и доступен для записи).
Вы правы, я никогда не закрывал STD *. Проблема была где-то в другом месте. –
Использование 'write()' для записи FD 0 на любой, к которому подключено 0. Если это сокет, это не 'stdin', и он не может« испортить вывод вашего приложения ». Непонятно, что у вас есть проблема для решения. – EJP
Возвращаемое значение из socketpair ** не ** файловый дескриптор, это код состояния (-1 или 0), что означает отказ или успех. – wildplasser
Неплохо, я хотел сказать, что сокету присвоен дескриптор файла 0,1 или 2. –