Я проверяю флаги, отправленные на открытый вызов (2) против разрешений, которые я установил в некоторых метафайлах. Переменные здесь связаны с восьмеричными значениями, обычно отправляемыми на вызовы типа chmod. Я хочу, чтобы блок if был введен, когда perms не соответствует соответствующему флагу.Проверка только флага O_RDONLY для открытия (2)
if((perms == 4 && !(flags & O_RDONLY)) ||
(perms == 2 && !(flags & O_WRONLY)) ||
(perms == 6 && !(flags & O_RDWR)))
Я ожидал, что это работает, и это делает очень хорошо в в O_WRONLY и O_RDWR. Однако фактическое значение O_RDONLY равно 0, поэтому оператор & вернет false для каждого значения. К сожалению, удаление отрицания приведет к нежелательному поведению каждого значения perms 4, пропускающего блок if. Как я могу достичь своей цели здесь?
Используйте '((флаги и O_ACCMODE) == O_RDONLY)' и т.д. –
Хотя 'flags' аргумент может содержать флаги, открытые режимы сами являются * не * флаги. –
Флаги @JoachimPileborg здесь равны открытому системному аргументу 'int flags'. – FutureShocked