Как бы то ни было, страница справочника неверна.Прототипы, которые он показывает:
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
не эквивалентны правильному прототипу:
int open(const char * pathname, int flags, ...);
Использование неправильных протоколов, которые он предоставляет (например, если вы создаете прототипвместо правильного заголовка) ваша программа будет иметь неопределенное поведение.(И это не просто теоретически; вероятно, он не сможет работать на x86_64 и других платформах с ABI с проходным регистром.)
То, что man-страница пыталась выразить (и делает очень плохую работу) заключается в том, что переменная часть списка аргументов open
может быть либо пустой, либо единственным аргументом типа mode_t
, где отсутствие или наличие необязательного аргумента зависит от значения flags
.