Điểm:0

API realpath trả về lỗi 22 (Đối số không hợp lệ) hoặc 38 (chức năng không được triển khai) trên Ubuntu 21.04 mới nhất và các hương vị linux mới nhất khác

lá cờ us
sachin@sachin:~$ con mèo 1.c
#include <limits.h> /* PATH_MAX */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
khoảng trống chính (khoảng trống) {
    ký tự *buf=NULL; 
    
    char *res = realpath("./new-CDM/dummy.c", buf);
    
    printf("kết quả = %s",res);
    printf("\nerrno = %d\n",errno);
    printf("\nBuf = %s\n",buf);
}
sachin@sachin:~$ gcc 1.c
sachin@sachin:~$ ./a.out 
kết quả = /home/sachin/new-CDM/dummy.c
sai = 22

Buf = (không)

Chương trình tương tự khi nó chạy trên Ubuntu 18.04 hoặc 20.04 không có lỗi.

Điểm:0
lá cờ cn

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.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.