ฉันไม่รู้ว่าทำไมรหัสนี้ไม่ทำงานภายใต้ NFS4 การใช้ NFS3 ทำงานได้อย่างสมบูรณ์ แนวคิดคือการหลีกเลี่ยงการเขียนไฟล์ในขณะที่กระบวนการยังคงอ่านอยู่
ฉันต้องการแก้ไขข้อบกพร่อง แต่ผู้ดูแลระบบของเราไม่สามารถทำได้ ซึ่งอาจเป็นเหตุผล ภายใต้การติดตั้ง NFS4 ของเรา ฉันพบเงื่อนไขนี้เสมอ
  ถ้า ( ฝูง (fp, LOCK_EX) == -1)
    printf("ข้อผิดพลาด: ไฟล์ %s ถูกล็อกแล้ว\n", ชื่อไฟล์);
โปรแกรมทั้งหมดคือ:
#รวม <sys/file.h>
#รวม <stdio.h>
#รวม <stdlib.h>
#รวม <unistd.h>
int main (int argc, ถ่าน **argv){
    ถ้า (argc<2){
        printf("การใช้งาน:\n a.out fileName\n");
        กลับ 1;
    }
    ถ่าน *ชื่อไฟล์=argv[1];
    int fp;
     
    /* บล็อกไฟล์ ฉันรู้ว่ากระบวนการสามารถเขียนได้ 
    ทำให้ข้อมูลของฉันไร้ประโยชน์*/
    fp=open(ชื่อไฟล์,O_RDONLY);
    ถ้า ( ฝูง (fp, LOCK_EX) == -1){
        printf("ข้อผิดพลาด: ไฟล์ %s ถูกล็อกแล้ว\n", ชื่อไฟล์);
    }
    อื่น{
        printf("ตกลง: ไฟล์ %s ถูกล็อค\n", ชื่อไฟล์ );
    }
    /* อ่านและแยกวิเคราะห์ชื่อไฟล์ 
       โปรเซสอื่นไม่น่าจะเขียนได้หรือ
       แก้ไขชื่อไฟล์ในขณะที่ฉันกำลังอ่าน
    */
    กลับ 0;    
}
แก้ไข:
ฉันอยากจะชี้แจง นี่คือส่วนของรหัสที่ฉันใช้ ชื่อไฟล์ควรจะเป็นไฟล์ที่มีอยู่ที่ถูกต้อง
ฉันกำลังอ่านชื่อไฟล์และทำสำเนา แก้ไขบางส่วน ฉันรู้ว่าในขณะที่ฉันดำเนินการนี้ กระบวนการภายนอกสามารถอัปเดตชื่อไฟล์ได้ ฉันต้องการใช้สัญญาณเพื่อหลีกเลี่ยงการแก้ไขในไฟล์นี้จนกว่าฉันจะทำมันเสร็จ โปรแกรมนี้ทำงานได้อย่างสมบูรณ์จนกระทั่งหยุดทำ ข้อแตกต่างเพียงอย่างเดียวคือระบบไฟล์ที่ชื่อไฟล์ตั้งอยู่ ได้รับการอัปเดตจากรูปแบบ NFS3 เป็น NFS4 แม้แต่ระบบปฏิบัติการ (SLE15.2) ก็เหมือนกันกับเคอร์เนล 5.3.18 และการใช้ strerror(errno) ทำให้เกิดข้อผิดพลาด seg บน NFS4 คำแนะนำเดียวเมื่อฉันพิมพ์ ("%d", ข้อผิดพลาด) คือ 9 ซึ่งควรเป็น "ตัวอธิบายไฟล์ผิด"
ขอบคุณสำหรับความช่วยเหลือของคุณ
จูเลีย