Puncte:0

API-ul realpath returnează eroarea 22 (Arg invalid) sau 38 (funcția nu este implementată) pe cel mai recent Ubuntu 21.04 și alte versiuni de ultimă oră Linux

drapel us
sachin@sachin:~$ cat 1.c
#include <limits.h> /* PATH_MAX */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
void main(void) {
    char *buf=NULL; 
    
    char *res = realpath("./new-CDM/dummy.c", buf);
    
    printf("rezultat = %s",res);
    printf("\nerrno = %d\n",errno);
    printf("\nBuf = %s\n",buf);
}
sachin@sachin:~$ gcc 1.c
sachin@sachin:~$ ./a.out 
rezultat = /home/sachin/new-CDM/dummy.c
eroare = 22

Buf = (null)

Același program când rula pe Ubuntu 18.04 sau 20.04 nu dă nicio eroare.

Puncte:0
drapel cn

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.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.