เราตระหนักถึงฟังก์ชันสำคัญที่การดำเนินการ IO มีบทบาทในการอ่านและเขียนไฟล์ อย่างไรก็ตาม การดำเนินการ IO แบบเก่าสามารถป้องกันไม่ให้โปรแกรมทำงานและทำให้เกิดความล่าช้าได้ สามารถใช้วิธีการ IO แบบไม่บล็อกเพื่อแก้ไขปัญหานี้ได้ เนื่องจาก IO ไม่มีการปิดกั้น โปรแกรมจึงสามารถทำงานต่อไปได้ในขณะที่การดำเนินการ IO อยู่ระหว่างดำเนินการ ฟังก์ชัน "select" เป็นเครื่องมือที่ใช้บ่อยในภาษาการเขียนโปรแกรม C เพื่อจัดให้มี IO ที่ไม่มีการปิดกั้น ด้วยฟังก์ชัน "เลือก" จะช่วยตรวจสอบตัวอธิบายไฟล์จำนวนมาก เช่น ซ็อกเก็ตหรือตัวจัดการไฟล์ เพื่ออ่าน/เขียนความพร้อมหรือข้อผิดพลาด ฟังก์ชัน "เลือก" ช่วยให้เราสามารถจัดการงาน IO หลายอย่างได้อย่างมีประสิทธิภาพโดยไม่ทำให้การทำงานของโปรแกรมล่าช้า โดยให้วิธีการตรวจสอบสถานะของทรัพยากร IO หลายรายการอย่างต่อเนื่อง
ให้เราหารือเกี่ยวกับวิธีการใช้งาน IO แบบไม่ปิดกั้นด้วยฟังก์ชัน "select" ในภาษา C เราจะหารือเกี่ยวกับการใช้งานพื้นฐานของ "select" และจัดเตรียมตัวอย่างการเขียนโปรแกรมเพื่ออธิบายการใช้งาน
ฟังก์ชัน “เลือก” คืออะไร?
ฟังก์ชัน “select” เป็นเครื่องมืออันทรงพลังในภาษา C ซึ่งช่วยให้เราใช้ IO ที่ไม่ปิดกั้นได้ ฟังก์ชันนี้ช่วยให้เราสามารถตรวจสอบตัวอธิบายไฟล์หลายตัว เช่น ซ็อกเก็ตหรือตัวจัดการไฟล์ เพื่อตรวจสอบว่าพร้อมที่จะอ่านหรือเขียนหรือไม่ ฟังก์ชันนี้ใช้ชุดคำอธิบายไฟล์สามชุด ได้แก่ ชุดการอ่าน ชุดการเขียน และชุดข้อยกเว้น เมื่อใช้ชุดเหล่านี้ เราสามารถระบุตัวอธิบายที่เราต้องการตรวจสอบสำหรับการดำเนินการเฉพาะได้ ฟังก์ชั่นรับค่าการหมดเวลาซึ่งช่วยให้เราสามารถระบุเวลาสูงสุดในการรอเหตุการณ์ได้ เมื่อมีเหตุการณ์เกิดขึ้นกับคำอธิบายที่ถูกตรวจสอบใดๆ หรือเมื่อการหมดเวลาหมดลง “เลือก” จะส่งกลับและให้ข้อมูลเกี่ยวกับคำอธิบายที่พร้อมใช้งาน ด้วยวิธีนี้ เราสามารถดำเนินการ IO ได้อย่างมีประสิทธิภาพโดยไม่ปิดกั้นการทำงานของโปรแกรม ซึ่งทำให้เหมาะสมในการจัดการกับการดำเนินการ IO หลายๆ รายการ
ฟังก์ชัน "เลือก" สำหรับการไม่ปิดกั้น IO มีข้อดีหลายประการ ช่วยให้เราสามารถจัดการการดำเนินงาน IO หลายรายการได้อย่างมีประสิทธิภาพโดยไม่ต้องใช้เธรดต่อการเชื่อมต่อ ซึ่งจะช่วยลดการใช้ทรัพยากร
อย่างไรก็ตาม มีข้อเสียบางประการของฟังก์ชัน "select" เช่น จำนวนตัวอธิบายไฟล์สูงสุดที่สามารถตรวจสอบได้ ซึ่งมักถูกจำกัดโดยระบบปฏิบัติการ นอกจากนี้ เมื่อจำนวนตัวอธิบายไฟล์เพิ่มขึ้น ประสิทธิภาพของฟังก์ชัน "เลือก" ก็สามารถลดลงได้
ตัวอย่างการเขียนโปรแกรม 1: ป>
#รวม
#รวม
#รวม
#รวม
#รวม
#รวม
#รวม
#include
int หลัก ()
{
// ตัวอธิบายไฟล์เพื่อตรวจสอบ
อินท์ fd1, fd2;
// ให้เราเปิดหรือสร้างไฟล์และตั้งค่าเป็นโหมดไม่บล็อก
fd1 =เปิด ("file1.txt", O_RDONLY | O_NONBLOCK);
fd2 =เปิด ("file2.txt", O_WRONLY | O_NONBLOCK);
fd_set read_fds, write_fds; // ชุดตัวอธิบายไฟล์
โครงสร้างการหมดเวลาหมดเวลา; // หมดเวลาสำหรับการเลือก
ในขณะที่ (1)
{
FD_ZERO (&read_fds); // ล้างชุดการอ่าน
FD_ZERO (&write_fds); // ล้างชุดการเขียน
FD_SET(fd1, &read_fds); // เพิ่ม fd1 ให้กับชุดการอ่าน
FD_SET(fd2, &write_fds); // เพิ่ม fd2 เข้าไปในชุดการเขียน
หมดเวลา tv_sec =4; // ตั้งเวลาหมดเวลา 4 วินาที
หมดเวลา tv_usec =0;
int ready_fds =เลือก (fd2 + 1, &read_fds, &write_fds, NULL, &หมดเวลา);
ถ้า (ready_fds ==-1) {
perror("เลือก");
ทางออก (EXIT_FAILURE);
}
อย่างอื่นถ้า (ready_fds ==0) {
printf ("หมดเวลา\n");
}
อย่างอื่น
{
ถ้า (FD_ISSET(fd1, &read_fds)) {
// fd1 พร้อมสำหรับการอ่านแล้ว
บัฟเฟอร์ถ่าน [100]; // สร้างบัฟเฟอร์เพื่ออ่าน
ssize_t bytesRead =อ่าน (fd1, บัฟเฟอร์, ขนาดของ (บัฟเฟอร์) - 1);
ถ้า (bytesRead> 0) {
บัฟเฟอร์ [bytesRead] ='\0'; // ยุติสตริงด้วยค่า Null
printf ("อ่านจาก file1.txt:%s \n", บัฟเฟอร์);
}
ถ้า (FD_ISSET (fd2, &write_fds)) {
// fd2 พร้อมสำหรับการเขียนแล้ว
const char* message ="สวัสดีตอนเช้า";
ssize_t bytesWritten =เขียน (fd2, ข้อความ, strlen (ข้อความ));
ถ้า (bytesWritten> 0) {
printf ("เขียนถึง file2.txt:%s \n", ข้อความ);
}
}
}
}
// ให้เราปิดตัวอธิบายไฟล์
ปิด (fd1);
ปิด (fd2);
กลับ 0;
เอาต์พุต: ป>
เขียนถึง file2.txt:สวัสดีตอนเช้า
เขียนถึง file2.txt:สวัสดีตอนเช้า
เขียนถึง file2.txt:สวัสดีตอนเช้า
เขียนถึง file2.txt:สวัสดีตอนเช้า
เกิดการหมดเวลา
คำอธิบาย: ป>
ในโปรแกรม เราใช้ IO ที่ไม่ปิดกั้นด้วย "select" ในภาษา C เพื่อตรวจสอบไฟล์สองไฟล์ซึ่งก็คือ "file1.txt" และ "file2.txt" มันตั้งค่าไฟล์เป็นโหมดไม่บล็อกซึ่งหมายความว่าตอนนี้โปรแกรมสามารถดำเนินการต่อไปได้โดยไม่ต้องรอให้อ่านหรือเขียนไฟล์ทั้งหมด ตัวอย่างการเขียนโปรแกรมใช้ฟังก์ชัน "select" เพื่อตรวจสอบว่ามีกิจกรรมใดๆ ในไฟล์ภายในระยะเวลาหมดเวลาที่กำหนดหรือไม่ หากไม่มีกิจกรรมใดๆ ในระหว่างหมดเวลา ระบบจะพิมพ์เฉพาะ "หมดเวลา" เท่านั้น หากมีกิจกรรมจะตรวจสอบว่าไฟล์ใดมีกิจกรรม หากมีกิจกรรมบน “file1.txt” โปรแกรมจะอ่านเนื้อหาของไฟล์และพิมพ์ออกมา หากมีกิจกรรมบน “file2.txt” ระบบจะพิมพ์ข้อความ “อรุณสวัสดิ์” ไปยังไฟล์ โปรแกรมยังคงตรวจสอบไฟล์ต่อไปอย่างไม่มีกำหนดจนกว่าจะถูกยกเลิก สุดท้ายจะปิดตัวอธิบายไฟล์เพื่อปล่อยทรัพยากรระบบ
บทสรุป
ฟังก์ชัน "select" ในภาษา C มอบโซลูชันที่ดีในการใช้งานการดำเนินการ I/O แบบไม่บล็อก ด้วยการอนุญาตให้มีการตรวจสอบตัวอธิบายไฟล์หลายตัว ช่วยให้สามารถจัดการงาน I/O หลายงานได้อย่างมีประสิทธิภาพ โดยไม่ปิดกั้นการทำงานของโปรแกรม แม้ว่า การพิจารณาข้อเสีย เช่น จำนวนตัวอธิบายไฟล์สูงสุดที่สามารถตรวจสอบได้นั้นเป็นสิ่งสำคัญ และปัญหาด้านประสิทธิภาพที่อาจเกิดขึ้นกับตัวอธิบายจำนวนมาก แม้จะมีข้อบกพร่องเหล่านี้ แต่ฟังก์ชัน "select" ยังคงเป็นตัวเลือกที่ดีในการจัดการ I/O ที่ไม่มีการบล็อกในโปรแกรม C
เกี่ยวกับผู้เขียน
บัมเด็บ โกช
Bamdeb Ghosh มีประสบการณ์ตรงในโดเมนเครือข่ายไร้สาย เขาเป็นผู้เชี่ยวชาญในการวิเคราะห์การจับ Wireshark บนเครือข่ายไร้สายหรือแบบมีสาย พร้อมด้วยความรู้เกี่ยวกับ Android, Bluetooth, คำสั่ง Linux และ Python ติดตามเว็บไซต์ของเขา:wifisharks.com