Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

I/O แบบไม่บล็อกหลักใน C โดยใช้การเรียกระบบ select()

I/O แบบไม่บล็อกหลักใน C โดยใช้การเรียกระบบ select()

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

ให้เราหารือเกี่ยวกับวิธีการใช้งาน IO แบบไม่ปิดกั้นด้วยฟังก์ชัน "select" ในภาษา C เราจะหารือเกี่ยวกับการใช้งานพื้นฐานของ "select" และจัดเตรียมตัวอย่างการเขียนโปรแกรมเพื่ออธิบายการใช้งาน

ฟังก์ชัน “เลือก” คืออะไร?

ฟังก์ชัน “select” เป็นเครื่องมืออันทรงพลังในภาษา C ซึ่งช่วยให้เราใช้ IO ที่ไม่ปิดกั้นได้ ฟังก์ชันนี้ช่วยให้เราสามารถตรวจสอบตัวอธิบายไฟล์หลายตัว เช่น ซ็อกเก็ตหรือตัวจัดการไฟล์ เพื่อตรวจสอบว่าพร้อมที่จะอ่านหรือเขียนหรือไม่ ฟังก์ชันนี้ใช้ชุดคำอธิบายไฟล์สามชุด ได้แก่ ชุดการอ่าน ชุดการเขียน และชุดข้อยกเว้น เมื่อใช้ชุดเหล่านี้ เราสามารถระบุตัวอธิบายที่เราต้องการตรวจสอบสำหรับการดำเนินการเฉพาะได้ ฟังก์ชั่นรับค่าการหมดเวลาซึ่งช่วยให้เราสามารถระบุเวลาสูงสุดในการรอเหตุการณ์ได้ เมื่อมีเหตุการณ์เกิดขึ้นกับคำอธิบายที่ถูกตรวจสอบใดๆ หรือเมื่อการหมดเวลาหมดลง “เลือก” จะส่งกลับและให้ข้อมูลเกี่ยวกับคำอธิบายที่พร้อมใช้งาน ด้วยวิธีนี้ เราสามารถดำเนินการ IO ได้อย่างมีประสิทธิภาพโดยไม่ปิดกั้นการทำงานของโปรแกรม ซึ่งทำให้เหมาะสมในการจัดการกับการดำเนินการ IO หลายๆ รายการ

ฟังก์ชัน "เลือก" สำหรับการไม่ปิดกั้น IO มีข้อดีหลายประการ ช่วยให้เราสามารถจัดการการดำเนินงาน IO หลายรายการได้อย่างมีประสิทธิภาพโดยไม่ต้องใช้เธรดต่อการเชื่อมต่อ ซึ่งจะช่วยลดการใช้ทรัพยากร

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

 
ตัวอย่างการเขียนโปรแกรม 1:

#รวม
#รวม
#รวม
#รวม
#รวม
#รวม
#รวม
#include // รวมส่วนหัว สำหรับ strlen

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

เกี่ยวกับผู้เขียน

I/O แบบไม่บล็อกหลักใน C โดยใช้การเรียกระบบ select()

บัมเด็บ โกช

Bamdeb Ghosh มีประสบการณ์ตรงในโดเมนเครือข่ายไร้สาย เขาเป็นผู้เชี่ยวชาญในการวิเคราะห์การจับ Wireshark บนเครือข่ายไร้สายหรือแบบมีสาย พร้อมด้วยความรู้เกี่ยวกับ Android, Bluetooth, คำสั่ง Linux และ Python ติดตามเว็บไซต์ของเขา:wifisharks.com