какие типы мы можем указать в `fdopen ()` и какая часть типа допустима? - PullRequest
0 голосов
/ 30 августа 2018

APUE говорит

В fdopen значения аргумента типа немного отличаются.

Дескриптор уже открыт, поэтому открытие для записи делает не обрезать файл. (Если дескриптор был создан открытым функция, например, и файл уже существовал, Флаг O_TRUNC будет контролировать, был ли файл обрезан. Функция fdopen не может просто обрезать любой файл, который она открывает для записи.)

Кроме того, стандартный режим добавления ввода / вывода не может создать файл (так как файл должен существовать, если дескриптор ссылается на него).

Как правило, когда мы вызываем fdopen() для дескриптора файла, возвращенного из open(), какие типы мы можем указать в fdopen()? Должен ли тип, указанный в fdopen(), быть точно таким же, как режим, указанный в open()? Может ли тип, указанный в fdopen(), быть подмножеством, надмножеством или ни подмножеством, ни надмножеством режима, указанного в open()?

Если нет ограничений на типы, указанные в fdopen() относительно режима, указанного в предыдущем open(), какая часть типа, указанная в fdopen(), является действительной, а какая - нет (т.е. игнорируется)?

Спасибо.

1 Ответ

0 голосов
/ 30 августа 2018

POSIX указывает:

Приложение должно гарантировать, что режим потока, выраженный аргументом mode, разрешен режимом доступа к файлу описания открытого файла, к которому относится fildes.

Раздел Обоснование идет немного дальше:

Значения mode аргументов fdopen() и fopen() различны. При fdopen(), открытый для записи (w или w+) не усекается, а append (a или a+) не может быть создан для записи. Форматы аргументов mode, включающие b, разрешены для соответствия стандартной функции ISO C fopen(). b не влияет на результирующий поток. Хотя этот том стандарта IEEE Std 1003.1-2001 явно не требуется, хорошая реализация режима добавления (a) привела бы к установке флага O_APPEND.

Поскольку файловые дескрипторы могут быть открыты различными способами (open(), socket() и т. Д.), И могут быть пользовательские драйверы устройств, которые имеют различные ограничения, на самом деле невозможно предоставить общую спецификацию связь между режимом open() и режимом fdopen().

Но вполне можно предположить, что если файловый дескриптор открыт для записи, вы должны иметь возможность использовать режим w, а если он открыт для чтения, вы можете использовать режим r.

...