Рейтинг:0

Realpath API возвращает ошибку 22 (неверный аргумент) или 38 (функция не реализована) в последней версии Ubuntu 21.04 и других последних версиях Linux.

флаг us
sachin@sachin:~$ кошка 1.c
#include <limits.h> /* PATH_MAX */
#include <stdio.h>
#include <stdlib.h>
#include <ошибка.h>
недействительным основным (недействительным) {
    символ *buf=NULL; 
    
    char *res = реальный путь("./new-CDM/dummy.c", buf);
    
    printf("результат = %s",рез);
    printf("\nerrno = %d\n",errno);
    printf("\nBuf = %s\n",buf);
}
sachin@sachin:~$ gcc 1.c
sachin@sachin:~$ ./a.out 
результат = /home/sachin/new-CDM/dummy.c
ошибка = 22

Буф = (ноль)

Та же программа, когда она работала в Ubuntu 18.04 или 20.04, не выдает ошибок.

Рейтинг:0
флаг cn

От человек 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. Если вас это удивляет, стоит подумать, почему.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.