Как именно _fsopen () работает? - PullRequest
1 голос
/ 12 июня 2019

Как именно _fsopen() работает?Есть ли в Linux аналогичный способ открытия файлов, который подготавливает файл для последующего совместного чтения или записи на основе shflag?

Ссылочная статья здесь .

Ответы [ 2 ]

4 голосов
/ 12 июня 2019

Как именно работает _fsopen ()?

Вы связались с документами.Это делает то, что они говорят, что делает.Если вы спрашиваете, как это реализовано, то мы не можем ответить, потому что эта информация является частной.shflg?

В Linux нет режимов общего доступа.Это причуды Windows.В Linux или других Unix-подобных операционных системах, таких как macOS, вам не нужны специальные флаги или режимы для обмена файлами между процессами.

В целом, _fsopen() - это специфичный для MS вариант стандартной библиотеки Cfopen() функция.В дополнение к флагу режима совместного использования, который не имеет отношения к другим операционным системам, он выполняет проверку параметров в виде различных других функций расширения MS.В Linux вы берете на себя ответственность за проверку своих аргументов и просто используете fopen().

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

В Windows файлы открываются с помощью функции CreateFileW, которая использует системный вызов NtCreateFile.

Аргумент dwShareMode используется для указания файлаполитика совместного использования и содержит комбинацию флагов FILE_SHARE_DELETE, FILE_SHARE_READ и FILE_SHARE_WRITE, которые сопоставляются с shflag аргументом _fsopen.

Если вы хотите узнать, как может выглядеть реализация функцииНапример, сначала вы должны иметь в виду, что MSVCRT пытается поддерживать некоторый эквивалент API дескриптора файла POSIX.Затем проверьте следующие функции:

  • _open_osfhandle позволяет преобразовать NT HANDLE в POSIX-подобный файловый дескриптор
  • _fdopen позволяет получить FILE * из файлового дескриптора (эквивалент функции POSIX fdopen).

Таким образом, возможная реализация может выглядеть следующим образом (впсевдокод):

FILE *_fsopen(...)
{
    HANDLE hFile = CreateFileW(...);
    int fd = _open_osfhandle(hFile, ...);
    return _fdopen(fd, ...);
}

В Linux нет эквивалента политики общего доступа к файлам, поэтому эквивалента нет.

PS: Другая связанная функция - _wsopen - объединяет CreateFileW и _open_osfhandle.

...