Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Làm chủ I/O không chặn trong C bằng lệnh gọi hệ thống select()

Làm chủ I/O không chặn trong C bằng lệnh gọi hệ thống select()

Chúng tôi biết chức năng thiết yếu của hoạt động IO trong việc đọc và ghi vào tệp. Tuy nhiên, các thao tác IO cũ có thể ngăn chương trình chạy và gây ra sự chậm trễ. Các phương pháp IO không chặn có thể được sử dụng để giải quyết vấn đề này. Vì IO không bị chặn nên chương trình có thể tiếp tục chạy trong khi các hoạt động IO đang diễn ra. Chức năng “select” là một công cụ được sử dụng thường xuyên trong ngôn ngữ lập trình C để cung cấp IO không chặn. Với chức năng "chọn", chức năng này giúp giám sát nhiều bộ mô tả tệp, chẳng hạn như ổ cắm hoặc phần xử lý tệp, để xác định mức độ sẵn sàng đọc/ghi hoặc lỗi. Chức năng “chọn” cho phép chúng tôi quản lý hiệu quả một số tác vụ IO mà không làm trì hoãn việc thực thi chương trình. Nó cung cấp cách kiểm tra trạng thái của nhiều tài nguyên IO một cách liên tục.

Chúng ta hãy thảo luận về cách triển khai IO không chặn bằng chức năng “chọn” trong ngôn ngữ C. Chúng ta sẽ thảo luận về cách sử dụng cơ bản của “select” và cung cấp một ví dụ lập trình để giải thích ứng dụng của nó.

Chức năng “Chọn” là gì?

Hàm “select” là một công cụ mạnh mẽ trong ngôn ngữ C giúp chúng ta triển khai IO không chặn. Chức năng này cho phép chúng tôi giám sát nhiều bộ mô tả tệp, như ổ cắm hoặc thẻ điều khiển tệp, để kiểm tra xem chúng đã sẵn sàng đọc hoặc ghi hay chưa. Hàm này có ba bộ mô tả tệp là tập đọc, tập ghi và tập ngoại lệ. Bằng cách sử dụng những bộ này, chúng ta có thể chỉ định những bộ mô tả nào chúng ta muốn theo dõi cho các hoạt động cụ thể. Hàm lấy giá trị thời gian chờ cho phép chúng ta chỉ định thời gian tối đa để chờ một sự kiện. Khi một sự kiện xảy ra trên bất kỳ bộ mô tả được giám sát nào hoặc khi hết thời gian chờ, “select” sẽ trả về và cung cấp thông tin về các bộ mô tả sẵn sàng. Bằng cách này, chúng tôi có thể thực hiện các thao tác IO một cách hiệu quả mà không chặn việc thực thi chương trình, điều này giúp chương trình phù hợp để xử lý nhiều thao tác IO.

Chức năng “chọn” cho IO không chặn mang lại một số lợi ích. Nó cho phép chúng tôi xử lý hiệu quả nhiều hoạt động IO mà không yêu cầu luồng trên mỗi kết nối, giúp giảm mức tiêu thụ tài nguyên.

Tuy nhiên, có một số nhược điểm của chức năng “select”, chẳng hạn như số lượng bộ mô tả tệp tối đa mà nó có thể giám sát, thường bị giới hạn bởi hệ điều hành. Ngoài ra, khi số lượng bộ mô tả tệp tăng lên, hiệu suất của chức năng “chọn” có thể giảm.

 
Ví dụ lập trình 1:

#include
#include
#include
#include
#include
#include
#include
#include // Bao gồm tiêu đề cho strlen

int chính ()
{
// Bộ mô tả tập tin để theo dõi
    int fd1, fd2;
    // Hãy để chúng tôi mở hoặc tạo tệp và đặt chúng ở chế độ không chặn
    fd1 =open ("file1.txt", O_RDONLY | O_NONBLOCK);
    fd2 =open ("file2.txt", O_WRONLY | O_NONBLOCK);
    fd_set read_fds, write_fds; // Bộ mô tả tập tin
    thời gian chờ cấu trúc;     // Hết thời gian chọn

    trong khi (1)
    {
        FD_ZERO (&read_fds);  // Xóa tập đọc
        FD_ZERO (&write_fds); // Xóa tập ghi

        FD_SET(fd1, &read_fds);   // Thêm fd1 vào tập đọc
        FD_SET(fd2, &write_fds);  // Thêm fd2 vào tập ghi
        thời gian chờ.tv_sec =4;       // Đặt thời gian chờ là 4 giây
        thời gian chờ.tv_usec =0;
        intready_fds =select (fd2 + 1, &read_fds, &write_fds, NULL, &timeout);
        nếu (ready_fds ==-1) {
            lỗi ("chọn");
            thoát (EXIT_FAILURE);
        }
        khác nếu (ready_fds ==0) {
            printf ("Đã hết thời gian chờ\n");
        }
        khác
         {
            if (FD_ISSET(fd1, &read_fds)) {
                // fd1 đã sẵn sàng để đọc
                bộ đệm char [100]; // Tạo bộ đệm để đọc vào
                ssize_t bytesRead =read(fd1, buffer, sizeof(buffer) - 1);
                nếu (byteRead> 0) {
                    bộ đệm [byteRead] ='\0'; // Kết thúc chuỗi bằng null
                    printf ("Đọc từ file1.txt:%s \n", bộ đệm);
                }
           

            if (FD_ISSET (fd2, &write_fds)) {
                // fd2 đã sẵn sàng để ghi
                const char* message ="Chào buổi sáng";
                ssize_t bytesWritten =write(fd2, message, strlen(tin nhắn));
                if (byteWriten> 0) {
                    printf ("Đã ghi vào file2.txt:%s \n", tin nhắn);
                }
            }
        }
    }
// Chúng ta hãy đóng phần mô tả File
    đóng (fd1);
    đóng (fd2);
    trả về 0;  

 
Đầu ra:

Đã viết vào file2.txt:Chào buổi sáng
Đã viết vào file2.txt:Chào buổi sáng
Đã viết vào file2.txt:Chào buổi sáng
Đã viết vào file2.txt:Chào buổi sáng
Đã hết thời gian chờ

 
Giải thích:

Trong chương trình, chúng tôi triển khai IO không chặn bằng “select” trong ngôn ngữ C để giám sát hai tệp là “file1.txt” và “file2.txt”. Nó đặt các tệp ở chế độ không chặn, nghĩa là chương trình hiện có thể tiếp tục thực thi mà không cần đợi các tệp được đọc hoặc ghi đầy đủ. Ví dụ lập trình sử dụng chức năng “select” để kiểm tra xem có bất kỳ hoạt động nào trên các tệp trong khoảng thời gian chờ được chỉ định hay không. Nếu không có hoạt động nào trong thời gian chờ, nó chỉ in “Đã xảy ra thời gian chờ”. Nếu có hoạt động, nó sẽ kiểm tra tập tin nào có hoạt động. Nếu có hoạt động trên “file1.txt”, chương trình sẽ đọc nội dung của tệp và in chúng. Nếu có hoạt động trên “file2.txt”, nó sẽ in thông báo “Chào buổi sáng” vào tệp. Chương trình tiếp tục theo dõi các tập tin vô thời hạn cho đến khi nó bị chấm dứt. Cuối cùng, nó đóng phần mô tả tệp để giải phóng tài nguyên hệ thống.

Kết luận

Hàm “select” trong C cung cấp một giải pháp tốt để triển khai các hoạt động I/O không chặn. Bằng cách cho phép giám sát nhiều bộ mô tả tệp, nó cho phép xử lý hiệu quả nhiều tác vụ I/O mà không chặn việc thực thi chương trình. Mặc dù vậy, điều quan trọng là phải xem xét những nhược điểm như số lượng bộ mô tả tệp tối đa có thể được theo dõi và các vấn đề về hiệu suất tiềm ẩn với số lượng lớn bộ mô tả. Bất chấp những sai sót này, chức năng “chọn” vẫn là một lựa chọn tốt để quản lý I/O không chặn trong các chương trình C.

Giới thiệu về tác giả

Làm chủ I/O không chặn trong C bằng lệnh gọi hệ thống select()

Bamdeb Ghosh

Bamdeb Ghosh đang có kinh nghiệm thực tế trong lĩnh vực Mạng không dây. Anh ấy là chuyên gia về phân tích chụp Wireshark trên Mạng không dây hoặc Mạng có dây cùng với kiến thức về các lệnh Android, Bluetooth, Linux và python. Theo dõi trang web của anh ấy:wifisharks.com