Score:0

realpath API ส่งคืนข้อผิดพลาด 22 (หาเรื่องไม่ถูกต้อง) หรือ 38 (ไม่ได้ใช้ฟังก์ชัน) ใน Ubuntu ล่าสุด 21.04 และรสชาติลินุกซ์ล่าสุดอื่น ๆ

ธง us
sachin@sachin:~$ แมว 1.c
#include <limits.h> /* PATH_MAX */
#รวม <stdio.h>
#รวม <stdlib.h>
#รวม <errno.h>
โมฆะหลัก (โมฆะ) {
    ถ่าน * buf = NULL; 
    
    ถ่าน * res = realpath ("./new-CDM/dummy.c", buf);
    
    printf("ผลลัพธ์ = %s",res);
    printf("\nerrno = %d\n",errno);
    printf("\nBuf = %s\n",บัฟ);
}
sachin@sachin:~$ gcc 1.c
sachin@sachin:~$ ./a.out 
ผลลัพธ์ = /home/sachin/new-CDM/dummy.c
เออร์โน = 22

บัฟ = (โมฆะ)

โปรแกรมเดียวกันเมื่อรันบน Ubuntu 18.04 หรือ 20.04 ไม่มีข้อผิดพลาด

Score:0
ธง cn

จาก คนที่ 3 เส้นทางจริง:

หากไม่มีข้อผิดพลาด realpath() จะส่งคืนตัวชี้ไปยัง modified_path

จาก ชาย 3 ผิด:

ค่าใน errno มีความสำคัญเฉพาะเมื่อค่าส่งคืนของการโทรระบุข้อผิดพลาด (เช่น -1 จากการเรียกระบบส่วนใหญ่ -1 หรือ NULL จากฟังก์ชันไลบรารีส่วนใหญ่) ฟังก์ชันที่ทำสำเร็จได้รับอนุญาตให้เปลี่ยน errno

ดังนั้นจึงไม่มีข้อผิดพลาดและค่าของ เอ่อ เป็นทางการ ไม่ได้กำหนด.


ค่าจริงที่ส่งกลับเป็นรายละเอียดภายในซึ่งถูกนำมาใช้แตกต่างกันในอดีต ขณะนี้ (21.10) น เอ่อ เป็นของเหลือจาก เส้นทางจริง ภายในพยายามติดตามลิงก์สัญลักษณ์บนส่วนประกอบพาธซึ่งไม่ใช่ในกรณีนี้

คุณสามารถดูสิ่งนี้ได้ดีที่สุดโดยการทำ dummy.c เป็นลิงก์สัญลักษณ์ไปยังไฟล์ เป้าหมาย.คแล้ววิ่ง strace./a.out เพื่อติดตามการเรียกเคอร์เนลของ linux โดยเฉพาะสาย:

readlink("/home/sachin/new-CDM", 0x7ffee6b57960, 1023) = -1 EINVAL (อาร์กิวเมนต์ไม่ถูกต้อง)
readlink("/home/sachin/new-CDM/dummy.c", "target.c", 1023) = 8
readlink("/home/sachin/new-CDM/target.c", 0x7ffee6b57960, 1023) = -1 EINVAL (อาร์กิวเมนต์ไม่ถูกต้อง)

ที่โทรไป อ่านลิงค์ ด้วยคอมโพเนนต์พาธที่ไม่ใช่สัญลักษณ์ล้มเหลว และมีการเปลี่ยนแปลง เอ่อ เป็น "EINVAL (อาร์กิวเมนต์ไม่ถูกต้อง)"

ที่ผ่านมา (20.04) อ่านลิงค์ ถูกเรียกหลังจากการตรวจสอบเพิ่มเติมว่าส่วนประกอบนั้นเป็นลิงค์ด้วยเท่านั้น ลสแตทจึงรักษาคุณค่าของ เอ่อ.

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

ดังนั้นการเปลี่ยนแปลงนี้น่าจะเป็นการเพิ่มประสิทธิภาพซึ่งมีผลข้างเคียงกับค่าเฉพาะในกรณีที่คุณไม่ควรเพิกเฉย


อนึ่ง การพิมพ์ของคุณ บัฟ ที่นี่ไม่มีจุดหมายเพราะเห็นได้ชัดว่ายังคงเป็นโมฆะ หากสิ่งนี้ทำให้คุณประหลาดใจ คุณควรคิดว่าทำไม

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา