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