Từ người đàn ông 3
:
Nếu không có lỗi, realpath() trả về một con trỏ tới resolve_path.
Từ người đàn ông 3 errno
:
Giá trị trong errno chỉ có ý nghĩa khi giá trị trả về của lệnh gọi chỉ ra lỗi (nghĩa là -1 từ hầu hết các lệnh gọi hệ thống; -1 hoặc NULL từ hầu hết các hàm thư viện); một chức năng thành công được phép thay đổi errno.
Do đó không có lỗi, và giá trị của sai lầm
là chính thức không xác định.
Giá trị thực được trả về là một chi tiết nội bộ đã được triển khai khác trong quá khứ. Hiện tại (21.10), các sai lầm
còn sót lại từ con đường thực tế
nội bộ đang cố gắng theo các liên kết tượng trưng trên các thành phần đường dẫn không có, chỉ trong trường hợp.
Bạn có thể thấy điều này tốt nhất bằng cách thực hiện giả.c
là một liên kết tượng trưng đến một tập tin mục tiêu.c
, rồi chạy bước đi ./a.out
để theo dõi các cuộc gọi kernel linux, cụ thể là các dòng:
readlink("/home/sachin/new-CDM", 0x7ffee6b57960, 1023) = -1 EINVAL (Đối số không hợp lệ)
đường dẫn đọc("/home/sachin/new-CDM/dummy.c", "mục tiêu.c", 1023) = 8
readlink("/home/sachin/new-CDM/target.c", 0x7ffee6b57960, 1023) = -1 EINVAL (Đối số không hợp lệ)
Các cuộc gọi đến liên kết đọc
với các thành phần đường dẫn không tượng trưng không thành công và đã thay đổi sai lầm
thành "EINVAL (Đối số không hợp lệ)".
Ngày xưa (20.04), liên kết đọc
chỉ được gọi sau khi kiểm tra bổ sung thành phần là một liên kết với thống kê
, do đó bảo toàn giá trị của sai lầm
.
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
đường dẫn đọc("/home/sachin/new-CDM/dummy.c", "mục tiêu.c", 4095) = 8
lstat("/home/sachin/new-CDM/target.c", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
Vì vậy, thay đổi này có thể là một tối ưu hóa có tác dụng phụ đối với một giá trị chỉ trong trường hợp bạn phải bỏ qua nó.
Ngẫu nhiên, bản in của bạn buf
ở đây là vô nghĩa vì nó rõ ràng vẫn là NULL. Nếu điều này làm bạn ngạc nhiên, bạn nên suy nghĩ về lý do tại sao.