fcntl関数の深い理解:Linuxシステムプログラミングにおけるファイル制御

概要

要約: fcntl 関数は、Linux システム プログラミングにおける重要な関数であり、ファイル記述子に対してさまざまな制御操作を実行するために使用されます。この記事では、fcntl 関数のプロトタイプ、各パラメーターの使用法、ブロッキング モードと非ブロッキング モードを切り替える方法を詳細に紹介し、読者が fcntl 関数をよりよく理解して適用できるように、対応するコード例を示します。

導入

fcntl関数は、Linuxシステムプログラミングにおけるファイル制御関数であり、ファイルのロックやファイル記述子の状態設定など、ファイル記述子に対するさまざまな操作を実行するために使用されます。そのプロトタイプは次のとおりです。

関数のプロトタイプとパラメータ

#include <fcntl.h>
int fcntl(int fd, int cmd, ...);

fcntl 関数は、ファイル記述子 fd、制御コマンド cmd、およびオプションの 3 番目のパラメーター arg の 3 つのパラメーターを受け入れます。

パラメータの使用法

ファイル記述子 fd: 制御する必要があるファイル記述子。

制御コマンド cmd: 特定の動作を決定します。一般的なコマンドは次のとおりです。

F_GETFL: ファイルディスクリプタのステータスフラグを取得します。
F_SETFL: ファイルディスクリプタのステータスフラグを設定します。
F_GETFD: ファイルディスクリプタのファイル実行フラグを取得します。
F_SETFD: ファイルディスクリプタのファイル実行フラグを設定します。
F_SETLK: ファイルロックを設定します。
F_GETLK: ファイルのロック状態を取得します。
オプションの 3 番目の引数 arg: cmd の値に応じて、一部の制御コマンドの追加引数。

拡張: fcntl はファイル属性を変更します

fcntl は、[すでに開かれている] ファイルのアクセス制御属性を変更するために使用されます
。F_GETFL、F_SETFL の 2 つのパラメータの使用に焦点を当てます。


	int fcntl(int fd, int cmd, ...)

fd ファイル記述子
cmd コマンドは、後続のパラメータの数を決定します。

int flgs = fcntl(fd,  F_GETFL);

flgs |= O_NONBLOCK

fcntl(fd,  F_SETFL, flgs);

获取文件状态: F_GETFL

设置文件状态: F_SETFL

端末ファイルはデフォルトで読み取りがブロックされていますが、ここでは fcntl を使用して読み取りを非ブロックに変更します。

1.#include <unistd.h>  
2.#include <fcntl.h>  
3.#include <errno.h>  
4.#include <stdio.h>  
5.#include <stdlib.h>  
6.#include <string.h>  
7.  
8.#define MSG_TRY "try again\n"  
9.  
10.int main(void)  
11.{
    
      
12.    char buf[10];  
13.    int flags, n;  
14.  
15.    flags = fcntl(STDIN_FILENO, F_GETFL); //获取stdin属性信息  
16.    if(flags == -1){
    
      
17.        perror("fcntl error");  
18.        exit(1);  
19.    }  
20.    flags |= O_NONBLOCK;  
21.    int ret = fcntl(STDIN_FILENO, F_SETFL, flags);  
22.    if(ret == -1){
    
      
23.        perror("fcntl error");  
24.        exit(1);  
25.    }  
26.  
27.tryagain:  
28.    n = read(STDIN_FILENO, buf, 10);  
29.    if(n < 0){
    
      
30.        if(errno != EAGAIN){
    
              
31.            perror("read /dev/tty");  
32.            exit(1);  
33.        }  
34.        sleep(3);  
35.        write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));  
36.        goto tryagain;  
37.    }  
38.    write(STDOUT_FILENO, buf, n);  
39.  
40.    return 0;  
41.}  

コンパイルして実行すると、結果は次のようになります。
ここに画像の説明を挿入

ご覧のとおり、これはノンブロッキング読み取りです。

要約する

fcntl 関数のプロトタイプ、パラメーターの使用法、ブロッキング モードとノンブロッキング モードの切り替え方法を詳しく紹介することで、読者の皆様が fcntl 関数をより深く理解し、応用できることを願っています。

おすすめ

転載: blog.csdn.net/qq_46017342/article/details/132545557