В чем разница между _SH_SECURE и _SH_DENYWR - PullRequest
7 голосов
/ 16 марта 2012

_SH_DENYWR запрещает любую другую попытку открыть файл с разрешениями на запись (нарушение общего ресурса) _SH_SECURE Устанавливает безопасный режим (совместное чтение, эксклюзивный доступ на запись)

_SH_SECURE кажется более новым, основываясь на том факте, чтоДокументы, кажется, затушевывают или опускают его в зависимости от того, куда вы смотрите.В сети почти нет информации, которую я мог бы найти.

Чем они отличаются?

1 Ответ

5 голосов
/ 16 марта 2012

Поведение _SH_SECURE зависит от доступа, запрошенного в аргументе mode к _fsopen() / _wfsopen(). Если запрашивается только доступ для чтения, то _SH_SECURE отображается на FILE_SHARE_READ. В противном случае он отображается на 0 (эксклюзивный доступ).

Контраст _SH_DENYWR, который всегда отображается на FILE_SHARE_READ.

Соответствующая часть исходного кода CRT (строки 269-301 open.c в Visual Studio 2010) выглядит следующим образом:

/*
 * decode sharing flags
 */
switch ( shflag ) {

    case _SH_DENYRW:        /* exclusive access */
        fileshare = 0L;
        break;

    case _SH_DENYWR:        /* share read access */
        fileshare = FILE_SHARE_READ;
        break;

    case _SH_DENYRD:        /* share write access */
        fileshare = FILE_SHARE_WRITE;
        break;

    case _SH_DENYNO:        /* share read and write access */
        fileshare = FILE_SHARE_READ | FILE_SHARE_WRITE;
        break;

    case _SH_SECURE:       /* share read access only if read-only */
        if (fileaccess == GENERIC_READ)
            fileshare = FILE_SHARE_READ;
        else
            fileshare = 0L;
        break;

    default:                /* error, bad shflag */
        _doserrno = 0L; /* not an OS error */
        *pfh = -1;
        _VALIDATE_RETURN_ERRCODE(( "Invalid sharing flag" , 0 ), EINVAL);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...