2015-08-24 3 views
2

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

Есть ли способ достичь этого под окнами? Желательно, чтобы я никогда не появлялся в файловой системе.

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

+0

Я понятия не имею, почему это было downvoted , поэтому я должен был угадать, как я мог бы улучшить вопрос :( – skyking

+2

Если FILE * читается или записывается только без поиска, вы можете использовать именованный канал для этого. –

+0

Связанный: [буфер памяти как ФАЙЛ \ *] (http://stackoverflow.com/questions/539537/memory-buffer-as-file) – anatolyg

ответ

0

Нет, нет такой вещи, как анонимный файл в Окна.

(Конечно, это не обязательно означает, что вы не можете иметь FILE *, что делает то, что вам нужно,., Например, мне нравится предложение Росса использовать именованный канал)

+0

У вас есть источник этого требования? – skyking

+0

Кажется, что есть! – anatolyg

+0

@anatolyg: возможно создать объект 'FILE *', который может удовлетворить потребности OP, но поскольку он не будет * фактически * быть файлом, я согласен с ответом. Но следует также отметить, что большинство ответов на вопрос, с которым вы связаны, не относятся к Windows, и единственное, что делает, это только вывод. (Например, мне нравится предложение Росса использовать именованный канал.) –

1

Самый разумно близко к memfd_create, который у вас есть в Windows - файлы с памятью. Статья MSDN об этом здесь: http://go.microsoft.com/fwlink/?linkid=180801

Но, в основном, вызовы API CreateFileMapping/.

Это не использует физический диск (если он не нуждается в памяти выгружаемого на диске) для нее, но, насколько мне известно, ни один не делает memfd_create

+0

На самом деле я о карте памяти, так что это звучит многообещающе, но насколько я вижу, «CreateFileMapping» возвращает (дескриптор) объект сопоставления файлов. Похоже, что на нем нет fx '_open_osfhandle'. – skyking

+0

Да, я так и не зашел так далеко, чтобы создать a-C-дескриптор из файла с отображением памяти, поэтому в Windows это может быть невыполнимо (не используя MMF в любом случае), поэтому я не сказал, что он был равен, просто «разумно Закрыть". Вы получаете дескриптор файла, который вы можете использовать с API Win32, но не дескриптор C-стиля (или, как вам кажется, по вашему комментарию) – Jcl

+0

Э-э ... какого черта есть * «виртуальная оперативная память» *? @skyking: прочитайте [документацию] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537.aspx): * hFile: Если hFile является INVALID_HANDLE_VALUE, вызывающий процесс также должен указать размер для объекта сопоставления файлов в параметрах dwMaximumSizeHigh и dwMaximumSizeLow. В этом случае CreateFileMapping создает объект сопоставления файлов указанного размера, который ** поддерживается файлом подкачки системы, а не файлом в файловой системе. ** " * – IInspectable

Смежные вопросы