ฉันไม่รู้ว่าทำไมรหัสนี้ไม่ทำงานภายใต้ 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 ซึ่งควรเป็น "ตัวอธิบายไฟล์ผิด"
ขอบคุณสำหรับความช่วยเหลือของคุณ
จูเลีย