На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> fopen vs 'совместный доступ' , fopen / fopen_s
    Код до сих пор работал с использованием fopen(),
    где-то из файла текстового читали, где-то в другой файл записывали. Всё было ОК.

    Потом поменяли везде fopen() на fopen_s(). Казалось бы, по сути одно и то же. Режимы и алгоритм остались прежние:
    ExpandedWrap disabled
              ...
              errno_t err = fopen_s(&fpPFile, szFP_FName, "wt");
              ...
              fprintf(fpPFile, "PlanRev:%d\n", nRevision);
              ...


    Почему же в новой версии (с fopen_s()) доступ к файлу эксклюзивный стал (пока он открытый)? Т.е., не дает открыть файл из другого процесса/приложения, пока его не закроешь здесь. С простым fopen() с этим всё было ОК.
    В МСДН что-то про это не нашел в описании функции.
      Цитата Azopp @
      В МСДН что-то про это не нашел в описании функции.
      Ну как же: fopen_s, _wfopen_s
      Цитата
      Files that are opened by fopen_s and _wfopen_s are not sharable. If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant—for example, _SH_DENYNO for read/write sharing.
        Цитата Qraizer @
        Цитата Azopp @
        В МСДН что-то про это не нашел в описании функции.
        Ну как же: fopen_s, _wfopen_s
        Цитата
        Files that are opened by fopen_s and _wfopen_s are not sharable. If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant—for example, _SH_DENYNO for read/write sharing.

        Спасибо! Как-то не заметил вчера.

        Интересно, _fsopen() ближе к обычному fopen(), как я понял, но почему-то оно не 'deprecated'.
          Устаревшими с точки зрения безопасности объявлены все те, которые в частности могут ненамеренно служить чёрным входом к личным данным и одновременно являются стандартными функциями, т.е. описываются Стандартом языка. С этой точки зрения дефолтовое разрешение совместного доступа может служить причиной утечки персональных данных, т.к. возможности указать режим разделения доступа отсутствует. Потому безопасная функция совместный доступ запрещает.
          Указанная _fsopen() явно требует указывать режим разделения, а значит перекладывает ответственность с себя на программиста. При этом она не является стандартной функцией языка, т.е. использующий её программист с большей вероятностью знает, что делает, когда разрешает тот или иной режим разделения. Дурацкая ИМХО политика, но уж какова есть.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0585 ]   [ 16 queries used ]   [ Generated: 18.04.25, 10:03 GMT ]