2017-02-08 38 views
1

Im пытаюсь открыть файл устройства (но вопрос в основном для обычного файла), и он работает со следующей строкойОткрытая система вызова с параметром 0, как флаг

fd = open(path,0); 

, но не с помощью следующей строки

fd = open(path,O_RDONLY,0777) 

(даже без режима 0777) Я просто не понимаю, что смысл кладя 0 вместо флага и почему его работу.

ответ

0

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().

Смежные вопросы