Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

select() システムコールを使用した C のノンブロッキング I/O のマスター

select() システムコールを使用した C のノンブロッキング I/O のマスター

私たちは、ファイルの読み取りと書き込みにおいて IO 操作が果たす重要な機能を認識しています。ただし、古い IO 操作によりプログラムの実行が妨げられ、遅延が発生する可能性があります。この問題を解決するには、ノンブロッキング IO メソッドを使用できます。 IO はノンブロッキングであるため、IO 操作の進行中もプログラムは実行を続けることができます。 「選択」関数は、ノンブロッキング IO を提供するために C プログラミング言語で頻繁に使用されるツールです。 「選択」機能を使用すると、ソケットやファイル ハンドルなどの多数のファイル記述子を監視して、読み取り/書き込みの準備状況やエラーを監視できます。 「選択」機能を使用すると、プログラムの実行を遅らせることなく、複数の IO タスクを効果的に管理できます。これにより、複数の IO リソースのステータスを継続的に確認する方法が提供されます。

C 言語の「select」関数を使用してノンブロッキング IO を実装する方法について説明します。 「select」の基本的な使用法について説明し、その応用例を説明するためのプログラミング例を示します。

「選択」機能とは何ですか?

「select」関数は、ノンブロッキング IO の実装に役立つ C 言語の強力なツールです。この関数を使用すると、ソケットやファイル ハンドルなどの複数のファイル記述子を監視して、読み取りまたは書き込みの準備ができているかどうかを確認できます。この関数は、読み取りセット、書き込みセット、および例外セットの 3 つのファイル記述子のセットを受け取ります。これらのセットを使用すると、特定の操作について監視する記述子を指定できます。この関数は、イベントを待機する最大時間を指定できるタイムアウト値を受け取ります。監視対象の記述子のいずれかでイベントが発生するか、タイムアウトが経過すると、「select」が返され、準備ができた記述子に関する情報が提供されます。このようにして、プログラムの実行をブロックすることなく IO 操作を効率的に実行できるため、複数の IO 操作の処理に適しています。

ノンブロッキング IO の「選択」機能には、いくつかの利点があります。これにより、接続ごとにスレッドを必要とせずに複数の IO 操作を効率的に処理できるため、リソースの消費が削減されます。

ただし、「選択」機能には、監視できるファイル記述子の最大数がオペレーティング システムによって制限されることが多いなど、いくつかの欠点があります。また、ファイル記述子の数が増えると、「選択」機能のパフォーマンスが低下する可能性があります。

 
プログラミング例 1:

#include
#include
#include
#include
#include
#include
#include
#include // strlen

ヘッダーをインクルードします。

intメイン()
{
// 監視するファイル記述子
    int fd1、fd2;
    // ファイルを開くか作成し、ノンブロッキング モードに設定しましょう
    fd1 =オープン ("file1.txt", O_RDONLY | O_NONBLOCK);
    fd2 =オープン ("file2.txt", O_WRONLY | O_NONBLOCK);
    fd_set 読み取り fds、書き込み fds; // ファイル記述子セット
    struct timeval タイムアウト。     // 選択のタイムアウト

    一方 (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 read_fds =select (fd2 + 1, &read_fds, &write_fds, NULL, &timeout);
        if (ready_fds ==-1) {
            pererror("選択");
            終了 (EXIT_FAILURE);
        }
        else if (ready_fds ==0) {
            printf ("タイムアウトが発生しました\n");
        }
        それ以外の場合
         {
            if (FD_ISSET(fd1, &read_fds)) {
                // fd1 を読み取る準備ができました
                文字バッファ [100]; // 読み込むバッファを作成します
                ssize_t bytesRead =read(fd1, バッファ, sizeof (バッファ) - 1);
                if (バイト読み取り> 0) {
                    バッファ [bytesRead] ='\0'; // 文字列を Null で終了する
                    printf ("file1.txt から読み取り:%s \n", バッファ);
                }
            }

            if (FD_ISSET (fd2, &write_fds)) {
                // fd2 への書き込み準備が整いました
                const char* message ="おはようございます";
                ssize_t bytesWritten =write (fd2, message, strlen (message));
                if (書き込まれたバイト数> 0) {
                    printf ("file2.txt に書き込みました:%s \n", メッセージ);
                }
            }
        }
    }
// ファイル記述子を閉じましょう
    閉じる(fd1);
    閉じる(fd2);
    0を返します。  
}

 
出力:

file2.txt に書き込みました:おはようございます
file2.txt に書き込みました:おはようございます
file2.txt に書き込みました:おはようございます
file2.txt に書き込みました:おはようございます
タイムアウトが発生しました

 
説明:

プログラムでは、「file1.txt」と「file2.txt」という2つのファイルを監視するために、C言語の「select」によるノンブロッキングIOを実装しています。ファイルを非ブロッキング モードに設定します。これは、ファイルが完全に読み書きされるのを待たずにプログラムが実行を継続できることを意味します。このプログラミング例では、「select」関数を使用して、指定されたタイムアウト期間内にファイルにアクティビティがあるかどうかを確認します。タイムアウト中にアクティビティがない場合は、「タイムアウトが発生しました」と表示されるだけです。アクティビティがある場合は、どのファイルにアクティビティがあるかがチェックされます。 「file1.txt」にアクティビティがある場合、プログラムはファイルの内容を読み取って印刷します。 「file2.txt」にアクティビティがある場合、「おはよう」メッセージがファイルに出力されます。プログラムは終了するまで無期限にファイルを監視し続けます。最後に、ファイル記述子を閉じてシステム リソースを解放します。

結論

C の「select」関数は、ノンブロッキング I/O 操作を実装するための優れたソリューションを提供します。複数のファイル記述子の監視を可能にすることで、プログラムの実行をブロックすることなく、複数の I/O タスクを効率的に処理できるようになります。ただし、監視できるファイル記述子の最大数や、多数の記述子による潜在的なパフォーマンスの問題などの欠点を考慮することが重要です。これらの欠陥にもかかわらず、「選択」関数は、C プログラムのノンブロッキング I/O を管理するための優れた選択肢であることに変わりはありません。

著者について

select() システムコールを使用した C のノンブロッキング I/O のマスター

バンデブ ゴーシュ

Bamdeb Ghosh は、ワイヤレス ネットワーキング ドメインでの実践経験を持っています。彼は、Android、Bluetooth、Linux コマンド、Python の知識に加え、ワイヤレスまたは有線ネットワーキングにおける Wireshark キャプチャ分析の専門家です。彼のサイトをフォローしてください:wifisharks.com


  1. Cで中実および中空の菱形パターンを印刷するプログラム

    プログラムの説明 以下に示すように、中実および中空の菱形パターンを印刷します アルゴリズム 中空菱形の場合- Accept the Number of Rows for Hollow Rhombus from the User Create a Hollow Rhombus containing the same number of Rows specified by the User. Print the first row containing the number of stars same as the number of rows. Print the second row

  2. Cプログラムで指定されたサイズの最大和二乗部分行列を出力します。

    NxNの行列が与えられた場合、行列MxMのすべての要素の加算が最大になるように、M=1であるMxMの部分行列を見つけます。行列NxNの入力には、ゼロ、正、および負の整数値を含めることができます。 例 Input:    {{1, 1, 1, 1, 1},    {2, 2, 2, 2, 2},    {3, 3, 3, 3, 3},    {4, 4, 4, 4, 4},    {5, 5, 5, 5, 5} } Output:    4 4