ฟังก์ชันอ่าน POSIX ในการเขียนโปรแกรม C

Posix Read Function C Programing



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

นิยามฟังก์ชัน

ก่อนกำหนดฟังก์ชั่นการอ่านในโค้ดของคุณ คุณต้องรวมแพ็คเกจที่จำเป็นก่อน







#รวม

นี่คือวิธีที่คุณกำหนดฟังก์ชันการอ่าน POSIX:



>>ssize_t เพรด(intงาช้าง,โมฆะ *บัฟsize_tnbyte, off_t offset);
>>ssize_t อ่าน(intเอฟดี,โมฆะ *บัฟsize_tnbytes);

สามอาร์กิวเมนต์พารามิเตอร์สามารถนำมาจากการเรียกวิธีการอ่าน:



int fd: file descriptor ของไฟล์จากตำแหน่งที่จะอ่านข้อมูล เราอาจใช้ file descriptor ที่ได้รับจากการเรียกระบบแบบเปิด หรือเราอาจใช้ 0, 1 หรือ 2 ที่อ้างอิงถึงอินพุตทั่วไป เอาต์พุตปกติ หรือข้อผิดพลาดทั่วไป ตามลำดับ





ถือเป็นโมฆะ *บัฟ: บัฟเฟอร์หรืออาร์เรย์อักขระที่ควรบันทึกและเก็บข้อมูลการอ่าน

Size_t nbyte: จำนวนไบต์ที่ต้องอ่านจากเอกสารก่อนตัดทอน ข้อมูลทั้งหมดสามารถเก็บไว้ในบัฟเฟอร์ได้หากข้อมูลที่จะอ่านสั้นกว่า nbytes



คำอธิบาย

วิธี read() พยายามอ่านไบต์ 'nbyte' ลงในบัฟเฟอร์แคชที่อ้างถึงโดย 'buf' จากไฟล์ที่เชื่อมต่อกับตัวอธิบายเอกสารที่เปิดอยู่ 'Fildes' หรือ 'fd' ไม่ได้กำหนดลักษณะของการอ่านพร้อมกันหลายครั้งบนสตรีม FIFO หรือเทอร์มินัลยูนิตเดียวกัน

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

เมื่อนับเป็น 0 read() จะรับรู้ข้อผิดพลาดที่กล่าวถึงด้านล่าง หากไม่มีข้อผิดพลาด หรือถ้าไม่มีข้อผิดพลาดในการอ่าน () การอ่าน () จะให้ค่าศูนย์โดยนับเป็น 0 ดังนั้นจึงไม่มีผลกระทบอื่น ๆ

หากจำนวนมากกว่า SSIZE_MAX ตาม POSIX.1 ผลลัพธ์จะถูกกำหนดโดยการใช้งาน

คืนมูลค่า

ตัวเลขของไบต์ 'read' และ 'pread' ที่เปลี่ยนกลับตามผลสัมฤทธิ์ทางการเรียนต้องเป็นจำนวนเต็มที่ไม่เป็นลบ ในขณะที่ศูนย์ชี้ไปที่จุดสิ้นสุดของไฟล์ ตำแหน่งของเอกสารมีความคืบหน้าด้วยตัวเลขนี้ หรือมิฉะนั้น เพื่อแสดงถึงข้อผิดพลาด เมธอดจะคืนค่า -1 และกำหนด 'errno' เมื่อตัวเลขนี้น้อยกว่าจำนวนไบต์ที่ร้องขอ จะไม่ใช่ข้อผิดพลาดของไบต์ อาจเป็นไปได้ว่าขณะนี้มีไบต์น้อยลง

ข้อผิดพลาด

ฟังก์ชัน pread และ read จะไม่สำเร็จหากเกิดข้อผิดพลาดเหล่านี้:

อีกครั้ง:

เอกสารหรือตัวอธิบายไฟล์ 'fd' เป็นของไฟล์ที่ไม่ใช่ซ็อกเก็ตที่มีป้ายกำกับว่าไม่บล็อก (ON NONBLOCK) และจะบล็อกการอ่าน

อีโวลบล็อก:

ตัวอธิบาย 'fd' เป็นของซ็อกเก็ตที่มีป้ายกำกับว่าไม่บล็อก (O_NONBLOCK) และจะบล็อกการอ่าน

EBADF:

'fd' อาจไม่ใช่คำอธิบายที่ใช้งานได้ หรืออาจไม่เปิดให้อ่าน

ความผิดพลาด:

สิ่งนี้จะเกิดขึ้นเมื่อ 'buf' ของคุณอยู่นอกพื้นที่ที่อยู่ที่สามารถเข้าถึงได้

EINTR:

ก่อนอ่านข้อมูลข้อมูลการโทรอาจมีสัญญาณขาดหาย

การคัดเลือก:

ข้อผิดพลาดนี้เกิดขึ้นเมื่อตัวอธิบาย 'fd' ของคุณเกี่ยวข้องกับอ็อบเจ็กต์ ซึ่งไม่เหมาะสำหรับการอ่าน หรือเอกสารถูกผูกกับแฟล็ก O_DIRECT และที่อยู่อื่นที่ระบุไว้ใน 'buf' ค่าที่ระบุใน 'count ' หรือออฟเซ็ตเอกสารไม่สัมพันธ์กันอย่างเหมาะสม

การคัดเลือก:

ตัวอธิบาย 'fd' อาจถูกสร้างขึ้นโดยใช้การเรียก timerfd_create(2) และบัฟเฟอร์ขนาดที่ไม่ถูกต้องได้รับการอ่าน

อีไอโอ:

เป็นข้อผิดพลาดของอินพุต/เอาต์พุต เกิดขึ้นเมื่อกลุ่มกระบวนการเบื้องหลังพยายามอ่านจากเทอร์มินัลการกำกับดูแล และอีกกลุ่มหนึ่งกำลังมองข้ามหรือปิดกั้น SIGTTIN หรือกลุ่มกระบวนการสูญเสียไป อีกสาเหตุหนึ่งของข้อผิดพลาดนี้อาจเป็นข้อผิดพลาดอินพุต/เอาต์พุตระดับต่ำขณะอ่านจากฮาร์ดดิสก์หรือเทป สาเหตุที่เป็นไปได้อีกประการหนึ่งของ EIO ในไฟล์ข้อมูลเครือข่ายคือการลบการล็อกคำแนะนำบน file descriptor และความล้มเหลวของการล็อกนั้น

ไอเอสดีอาร์:

ตัวอธิบายไฟล์ 'fd' เป็นของไดเร็กทอรี

หมายเหตุ:

ข้อผิดพลาดอื่นๆ อาจเกิดขึ้นได้เช่นกัน โดยอาจเกิดขึ้นกับวัตถุที่เชื่อมโยงกับตัวอธิบาย 'fd' ทั้งฟอร์ม size_t และ ssize_t ไม่มีการทำเครื่องหมายและทำเครื่องหมายประเภทข้อมูลตัวเลขที่กำหนดโดย POSIX.1 บน Linux สูงสุด 0x7ffff000 (2,147,479,552) ไบต์สามารถส่งได้โดยฟังก์ชันการอ่าน (และการเรียกระบบที่เทียบเท่า) ส่งคืนจำนวนไบต์ที่ส่งครั้งแรก (บนทั้งแพลตฟอร์ม 32 บิตและ 64 บิต) ด้วยระบบไฟล์ NFS ในวินาทีแรกที่ประทับเวลามีการเปลี่ยนแปลงโดยการอ่านข้อมูลเล็กๆ น้อยๆ การเรียกครั้งต่อๆ มาจะไม่ทำเช่นนั้น มันถูกทริกเกอร์โดยการแคชของแอตทริบิวต์ฝั่งไคลเอ็นต์ เนื่องจากไคลเอ็นต์ NFS จะไม่อัปเดตเซิร์ฟเวอร์ผ่าน st_atime (เวลาเข้าถึงไฟล์ล่าสุด) แม้ว่าจะไม่ใช่ทั้งหมด แต่ไคลเอ็นต์ NFS จะไม่ทริกเกอร์การเปลี่ยนแปลงเป็น st- atime บนเซิร์ฟเวอร์เนื่องจากไม่มีการอ่านค่าฝั่งเซิร์ฟเวอร์ การลบแคชแอตทริบิวต์ฝั่งไคลเอ็นต์อาจเข้าถึงข้อมูลเมตาของ UNIX ได้ แต่สิ่งนี้จะเพิ่มภาระงานบนเซิร์ฟเวอร์อย่างมากและส่งผลต่อประสิทธิภาพการทำงานในกรณีส่วนใหญ่

ตัวอย่าง 01:

นี่คือโปรแกรม C เพื่อสาธิตการเรียกใช้ฟังก์ชันการอ่านบนระบบ Linux เขียนคำสั่งด้านล่างตามที่อยู่ในไฟล์ใหม่ เพิ่มไลบรารี และในฟังก์ชันหลัก ให้เริ่มต้นตัวอธิบายและขนาด ตัวอธิบายกำลังเปิดไฟล์ และใช้ขนาดเพื่ออ่านข้อมูลไฟล์

ผลลัพธ์สำหรับโค้ดด้านบนจะเป็นดังแสดงในภาพด้านล่าง

ตัวอย่าง 02:

อีกตัวอย่างหนึ่งที่แสดงให้เห็นการทำงานของฟังก์ชันอ่านได้รับด้านล่าง

สร้างไฟล์อื่นและเขียนโค้ดด้านล่างตามที่อยู่ในไฟล์ ต่อไปนี้เป็นตัวอธิบายสองตัวคือ fd1 & fd2 ซึ่งทั้งคู่มีสิทธิ์เข้าถึงไฟล์ตารางเปิดของตนเอง ดังนั้นสำหรับ foobar.txt ตัวอธิบายทุกตัวจะมีตำแหน่งไฟล์ ไบต์แรกของ foobar.txt ถูกแปลจาก fd2 และผลลัพธ์คือ c = f ไม่ใช่ c = o

บทสรุป

เราได้อ่านฟังก์ชั่นการอ่าน POSIX ในการเขียนโปรแกรม C อย่างมีประสิทธิภาพ หวังว่าจะไม่มีข้อสงสัยเหลือ