2014-05-28, #1
May. 28th, 2014 02:38 pmFun facts: если сделать вот так в консоли Linux:
то вызов
вернется с ошибкой потому что системный вызов open() вернет код ELOOP из-за превышения максимального количества редиректов.
А вот если сделать
То он вернет код -1, потому что обнаружит цикл.
Т.е. open() и логика программы readlink отличаются (понятно почему, держать в ядре hashmap неограниченный размеров, не очень удачная идея, поэтому у open() жесткий лимит на 40 симлинков)
Ну и следующий из этого забавный факт, если сделать симлинки в виде
То
упадет с ошибкой, а
выполнится успешно.
ln -s l1 l2 ln -s l2 l1
то вызов
cat l1
вернется с ошибкой потому что системный вызов open() вернет код ELOOP из-за превышения максимального количества редиректов.
А вот если сделать
readlink -f l2
То он вернет код -1, потому что обнаружит цикл.
Т.е. open() и логика программы readlink отличаются (понятно почему, держать в ядре hashmap неограниченный размеров, не очень удачная идея, поэтому у open() жесткий лимит на 40 симлинков)
Ну и следующий из этого забавный факт, если сделать симлинки в виде
l41 -> l40 -> .. -> l1 -> data
То
cat l41
упадет с ошибкой, а
readlink -f l41
выполнится успешно.