От человек 3
:
Если ошибки нет, realpath() возвращает указатель на разрешенный_путь.
От человек 3
:
Значение в errno имеет значение только тогда, когда возвращаемое значение вызова указывает на ошибку (т. е. -1 для большинства системных вызовов; -1 или NULL для большинства библиотечных функций); функция, которая завершилась успешно, может изменить errno.
Следовательно, ошибки нет, и значение ошибаться
официально неопределенный.
Возвращаемое фактическое значение является внутренней деталью, которая в прошлом реализовывалась иначе. В настоящее время (21.10) ошибаться
осталось от реальный путь
внутренне пытается перейти по символическим ссылкам на компоненты пути, которых нет, на всякий случай.
Вы можете увидеть это лучше всего, сделав манекен.с
быть символической ссылкой на файл цель.с
, а затем работает strace ./a.out
для отслеживания вызовов ядра Linux, в частности строк:
readlink("/home/sachin/new-CDM", 0x7ffee6b57960, 1023) = -1 EINVAL (неверный аргумент)
readlink("/home/sachin/new-CDM/dummy.c", "target.c", 1023) = 8
readlink("/home/sachin/new-CDM/target.c", 0x7ffee6b57960, 1023) = -1 EINVAL (неверный аргумент)
Звонки в ссылка для чтения
с несимволическими компонентами пути потерпели неудачу и изменились ошибаться
на "EINVAL (неверный аргумент)".
В прошлом (20.04) ссылка для чтения
вызывался только после дополнительной проверки, что компонент является ссылкой на lstat
, тем самым сохраняя значение ошибаться
.
lstat("/home/sachin/new-CDM", {st_mode=S_IFDIR|0775, st_size=20, ...}) = 0
lstat("/home/sachin/new-CDM/dummy.c", {st_mode=S_IFLNK|0777, st_size=8, ...}) = 0
readlink("/home/sachin/new-CDM/dummy.c", "target.c", 4095) = 8
lstat("/home/sachin/new-CDM/target.c", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
Таким образом, это изменение, вероятно, является оптимизацией, которая оказывает побочный эффект на значение только в тех случаях, когда вы должны его игнорировать.
Кстати, ваша печать буф
здесь было бессмысленно, так как это, очевидно, все еще было бы NULL. Если вас это удивляет, стоит подумать, почему.