C ++, как скопировать указатель FILE * - PullRequest
2 голосов
/ 04 апреля 2019

Я нашел решение здесь Дублирование файловых указателей?

FILE *fp2 = fdopen (dup (fileno (fp)), "r");

но согласно http://man7.org/linux/man-pages/man2/dup.2.html, новый дескриптор файла, созданный dup, они ссылаются на тот же дескриптор открытого файла и, таким образом, делятся статусом. Это не то, что я хочу. Я хочу создать совершенно новый объект ввода-вывода, который ссылается на файл, указанный старым FILE *

Есть ли способ сделать это?

Добавить: У меня нет имени файла на самом деле. Я делаю глубокую копию объекта, который содержит открытый указатель FILE, поэтому я должен скопировать и это.

1 Ответ

4 голосов
/ 04 апреля 2019

Я хочу создать совершенно новый объект ввода-вывода, который ссылается на файл, указанный старым FILE *

Вы предполагаете, что файл связан с оригинальным FILE *имеет некоторую форму идентичности, отличную от объекта ввода-вывода, к которому он осуществляется.Это верно для обычных файлов и некоторых других объектов, но неверно для других, таких как сокеты и каналы.Таким образом, нет универсального механизма для выполнения того, что вы просите.

Для особого случая объектов, к которым можно получить доступ через файловую систему, способ создания нового объекта ввода-вывода, связанного с тем же файлом,open() или fopen() файл через путь к нему.Вот что делают эти функции.Не существует стандартного способа получить путь из номера FILE * или дескриптора файла, но в Linux (поскольку вы отметили это) вы можете использовать readlink() для записи открытого файла в /proc, как описано здесь .

Имейте в виду, что даже для обычных файлов подход readlink не гарантированно работает.В частности, он не будет работать, если путь, по которому был открыт исходный файл, с тех пор не был связан, и фактически в этом случае это может привести к открытию неправильного файла.Вы можете проверить это, запустив fstat() как для старого, так и для нового номера дескриптора файла - если файлы на самом деле одинаковы, то они будут иметь одинаковые номера инодов на одном хост-устройстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...