Din omul 3 calea reală
:
Dacă nu există nicio eroare, realpath() returnează un pointer către soluted_path.
Din om 3 errno
:
Valoarea în errno este semnificativă numai atunci când valoarea returnată a apelului a indicat o eroare (adică -1 din majoritatea apelurilor de sistem; -1 sau NULL din majoritatea funcțiilor de bibliotecă); unei funcții care reușește i se permite să schimbe errno.
Prin urmare, nu există nicio eroare, iar valoarea lui greseala
este oficial nedefinit.
Valoarea reală returnată este un detaliu intern care a fost implementat diferit în trecut. În prezent (21.10), cel greseala
este ramas din cale reală
încercând intern să urmeze legături simbolice pe componentele căii care nu sunt, pentru orice eventualitate.
Puteți vedea acest lucru cel mai bine făcând manechin.c
să fie o legătură simbolică către un fișier tinta.c
, și apoi alergând strace ./a.out
pentru a urmări apelurile la nucleul Linux, în special liniile:
readlink("/home/sachin/new-CDM", 0x7ffee6b57960, 1023) = -1 EINVAL (Argument nevalid)
readlink("/home/sachin/new-CDM/dummy.c", "target.c", 1023) = 8
readlink("/home/sachin/new-CDM/target.c", 0x7ffee6b57960, 1023) = -1 EINVAL (argument nevalid)
Apelurile către readlink
cu componente de cale non-simbolice au eșuat și s-au schimbat greseala
la „EINVAL (Argument nevalid)”.
În trecut (20.04), readlink
a fost apelat doar după o verificare suplimentară cu care componenta era o legătură lstat
, păstrând deci valoarea de greseala
.
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
Deci, această modificare este probabil o optimizare care are un efect secundar asupra unei valori numai în cazurile în care ar trebui să o ignorați.
De altfel, imprimarea dvs. de buf
aici a fost inutilă, deoarece, evident, ar fi încă NULL. Dacă acest lucru vă surprinde, ar merita să vă gândiți de ce.