FILE * продолжает работать, если связанный с ними fd используется для каких-то других целей? - PullRequest
0 голосов
/ 14 июня 2019

Я обычно работал только с файловыми дескрипторами. Я не уверен, будет ли FILE * продолжать работать правильно, если связанный с ним fd используется для какой-то другой цели. Существуют ли ФАЙЛ * и связанный с ним fd независимо?

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

В системах POSIX, да, fd поддерживает FILE*.Закрытие FILE* закрывает FD.Чередование использует fd, и FILE* рискует испортить ваши данные (FILE* выполняет буферизацию в пользовательском режиме, которую обходит fd);вам нужно было бы либо отключить буферизацию (с помощью setvbuf или тому подобное), либо убедиться, что FILE* надежно сброшен, прежде чем что-либо напрямую запишется в fd.В противном случае, пока ничто не закроет fd, FILE* должен продолжать работать.

1 голос
/ 14 июня 2019

Мой вопрос в основном связан с использованием fileno () для получения fd для этого потока.Это заставило меня подумать, что файловые потоки как-то связаны с fd.

Они есть.

Функции в <stdio.h> обычно реализуются как обертка вокруг низкоуровневых ОС.конкретные функции.Это требует некоторого учета.Структура стандарта FILE должна отслеживать «как ОС обращается к потоку» (т. Е. В системах POSIX, дескриптор файла), а также любые буферы, связанные с потоком, индексирует эти буферы, нужно ли файлуудаляется после закрытия (tmpfile()), независимо от того, должны ли эти буферы быть free() d (потому что библиотека распределила их) или нет (потому что пользователь выделил их и связал их с потоком через setvbuf()), многобайтовое кодированиесостояние потока и, начиная с C11, мьютекс, с помощью которого можно заблокировать поток во время операций для обеспечения безопасности потока.

fileno() является функцией, специфичной для POSIX, для получения дескриптора файла изFILE struct , с любым доступом к этому существу без знания стандартной библиотеки.Приводя к стандартным функциям библиотеки, имеющим иное представление о состоянии потока, чем у операционной системы, это может сыграть в шутку с вашей программой.

Не смешивайте POSIX и стандартдоступ к файлу, если вы точно не знаете, что делаете.

...