The POSIX specifications for open()
требует, чтобы в точности один из заданных констант O_EXEC
, O_RDONLY
, O_WRONLY
, O_RDWR
или O_SEARCH
быть включены в тростнике, но они не указать значения от этих констант. В самом деле, они отмечают в обосновании, что «в исторических реализациях значение O_RDONLY
равно нулю». В такой реализации указание флагов как 0 эквивалентно заданию (только) O_RDONLY
.
Использование POSIX термина «исторический» не следует рассматривать как указание на то, что для O_RDONLY
редко имеет значение 0; напротив, это довольно часто встречается в современных реализациях. Тем не менее, вы не должны указывать флаги как 0, когда вы имеете в виду O_RDONLY
, так как это оставляет ваш код открытым для поломки в системах с различными определениями констант флага.
Если вы действительно можете открыть флаги, указанные как 0, но не с флагами, указанными как O_RDONLY
(что кажется сомнительным), то должно быть так, что O_RDONLY
имеет значение, отличное от 0 в вашей реализации. Тогда может быть, что один из других членов обязательной константной группы имеет значение 0 и что вы можете открыть целевой файл в соответствующем режиме - например, возможно, путь обозначает каталог, а это O_SEARCH
, который имеет значение 0. В противном случае вы вызываете неопределенное поведение от open()
. UB не должен проявлять себя как возвращающий индикатор ошибки, и если это не так, значит, это ничего не говорит.
Добавление: учитывая, что open(path, O_RDONLY)
терпит неудачу для вас (как указано возвращение -1), было бы целесообразно, чтобы исследовать причину ошибки, исследуя errno
, или, лучше, печатая диагностики с помощью perror()
.