ホームページ  >  記事  >  運用・保守  >  Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

WBOY
WBOY転載
2023-05-15 21:25:111628ブラウズ

Linux オペレーティング システムは、すべてがファイルであるという概念を追求しており、ほとんどすべてのファイル デバイスは、open()/close()/write()/read() などの一連のシステム コールで操作できます。システム コールは、オペレーティング ファイルの C ライブラリ コールに似ています。 Linux に付属のマニュアルが最も信頼できます。システムコールの使用状況はマニュアルを確認してください。

コード名—— 意味

  • ##1 —— ユーザーがシェル環境で操作/実行できるコマンド

  • 2 —— システム カーネルから呼び出すことができる関数とツール

  • 3 —— よく使用される関数と関数ライブラリ、主に一部C

  • 4 の関数ライブラリの説明 —— デバイス ファイルの説明 (通常は /dev

  • 5 の下にあるデバイス) — &mdash ; 設定ファイルまたは特定のファイルの形式

  • ##6 —— ゲーム
  • 7 —— 管理およびプロトコルなど、例: Linux ファイル システム、ネットワーク プロトコルなど
  • ##8 —— システム管理者が使用できるコマンド
  • 9 ——カーネル関連ファイル
  • システム ヘッダー ファイルは通常、Linux の
  • /usr/include
ディレクトリに保存されることに注意してください。以下に含まれるヘッダー ファイルの一部は、include sys、実際には、include

open() の下のサブディレクトリにあるヘッダー ファイルです——ファイルを開くか作成します

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法戻り値のタイプ:

int——ファイル記述子 fd。ファイルが開かれるたびに、ファイル記述子が取得されます。このファイル記述子は整数です。ファイル記述子を通じて読み取りおよび書き込み操作を実行します。

失敗: -1
  • 成功: >= 0 (ファイル記述子);
  • mode_t は型のエイリアスで、実際には符号付き整数です。open 関数の場合、3 番目のパラメータは新しいファイルを作成する場合にのみ使用されます。
  • flag: open Flags

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法注:

これらは実際に定義されたマクロです。複数のパラメータを使用する必要がある場合は、ビット単位または "

|" を使用して複数のパラメータを形成しますflag パラメータ は、次のメソッドと一緒に使用することもできます:

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

##その他はいちいち紹介しませんので、必要な場合はご自身でご確認ください。

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法write()

戻り値Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法:

成功すると、書き込まれたバイト数 入力されたバイト数;

  • エラーが発生した場合は -1;

  • 注: 書き込まれる予定のバイト数書き込みと関数の戻り値が等しくない場合は、書き込みエラーがあることを意味し、書き込みが成功したかどうかを確認するために使用できます;

  • #パラメータ:

fd

: ファイルを書き込むためのファイル記述子;
  • buf

    : 書き込むデータを保存するためのキャッシュ書き込まれた;
  • count

    : データを 1 回書き込むのに必要なバイト数;
  • 注:

通常のファイルの場合は、書き込みます。操作はファイルの現在のオフセットから開始されます。ファイルを開くときに O_APPEND オプションが指定されている場合、ファイル オフセットは、各書き込みの前にファイルの現在の末尾に設定されます。手術。書き込みが成功すると、ファイル オフセットは実際に書き込まれたバイト数だけ増加します。

read()

戻り値

: 読み取ったバイト数Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

Ifファイルの終わりに達した場合は 0、エラーがある場合は -1、

  • #パラメータ

fd : ファイルを読み取るためのファイル記述子;

  • buf: 読み取りデータを保存するためのキャッシュ;

  • #count: データを 1 回読み取るのに必要なバイト数。戻り値は実際に読み取られたバイト数であり、同じではないことに注意してください。

  • 注: 読み取り操作は、ファイルの 現在のディスプレイスメントから開始されます

    。正常に戻る前に、ディスプレイスメントは実際に読み取られたバイト数だけ増加します (これはディスプレイスメントは自分で設定できます);
close()

注: プロセスが終了すると、プロセスが開いたすべてのファイルはカーネルによって自動的に閉じられます。

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

注: これらの キャッシュなしの関数 は、カーネルによって提供されるシステム コールです。これは、C 言語で学習した IO とまったく同じです。操作は異なります。これらは標準 C の一部ではなく、POSIX の一部であるという点です。

標準 C がファイルを操作する場合、FILE の構造体ポインターを操作し、ここでファイル記述子が使用されます。

ファイル記述子の範囲は 0 ~ OPEN MAX です。初期の Unix で採用されていた上限は 19 でした (つまり、各プロセスは 20 個のファイルを開くことができます)。現在、多くのシステムはまもなく 63 まで増加します。Linuxが 1024 である場合、特定の番号は のヘッダー ファイルで見つけることができます。

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

ファイル記述子とファイル ポインター

  • FILE * fdopen( int fd,const char *mode)、ファイル記述子をファイル ポインタに変換します;

  • int fileno(FILE *stream)、ファイル ポインタをファイル記述子に変換します;

lseek function

関数: 開いているファイルを見つけます

off_t lseek(int fd,off_t offset,int whence);

  • fd :開かれたファイル記述子;

  • offset: 変位量;

  • whence :配置位置、つまり基準点

  • SEEK_SET: ファイルの先頭からのオフセット バイトにファイルの変位を設定します。

  • SEEK_CUR: ファイルのディスプレイスメントを現在の値にオフセットを加えた値に設定します。オフセットは正または負にすることができます。

  • SEEK_END: ファイルの変位をファイルの長さにオフセットを加えた値に設定します。オフセットは正または負の値にすることができます (この時点で正の値の場合は、ホール ファイルが関係しています。以下の説明を参照してください)。

  • 戻り値: **成功した場合は、新しいファイルの変位 (絶対変位) を返します。 **エラーが発生した場合は -1、ファイルの終端が位置決めされた場合は、ファイルのサイズを返すことができます;

  • lseek 関数は、関連するファイルがディスプレイスメントを設定できるかどうかを判断するために使用することもできます。ファイル記述子がパイプまたは FIFO を参照している場合は、 lseek は -1 と errno を返します EPLPE に設定します;

ホール ファイルの例:

#include<stdio.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>

//生成空洞文件
char *buffer = "0123456789";

int main(int argc,char *argv[])
{
	if(argc < 2)
	{
		fprintf(stderr,"-usage:%s [file]\n",argv[0]);
		exit(1);
	}

	int fd = open(argv[1],O_WRONLY | O_CREATE | O_TRUNC,0777);
	if(fd < 0)
	{
		perror("open error");
		exit(1);
	}

	size_t size = strlen(buffer) * sizeof(char);
	//将字符串写入到空洞文件中
	if(write(fd,buffer,size) != size)
	{
		perror("write error");
		exit(1);
	}
	
	//定位到文件尾部的10个字节处
	if(lseek(fd,10L;SEERK_END) < 0)
	{
		perror("lseek error");
		exit(1);
	}
	//从文件尾部的10个字节处再写入字符串
	if(write(fd,buffer,size) != size)
	{
		perror("write error");
		exit(1);
	}
	close(fd);
	return 0;
}

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

次のことができますmore コマンドを使用して表示することを確認してください ファイルの内容を確認すると、表示された内容が 1 回の書き込みの結果にすぎないことがわかります。od

-c コマンドを使用して、ファイルの ASSCI コードを表示します。 2 つの内容の間に \0 が 10 個あることがわかります。これは空です。vim でファイルを開くと、ファイルの内容も確認できます。^@ 文字が 10 個あります。

注: 各ファイルには「現在のファイル オフセット」が関連付けられています。これは、ファイルの先頭から計算されたバイト数を示す負ではない整数です。通常、読み取りおよび書き込み操作はファイルの現在のオフセットから始まり、読み取りまたは書き込みのバイト数だけオフセットを増やします。システムのデフォルトでは、ファイルが開かれるとき、O_APPEND オプションが指定されていない限り、ファイル オフセットは 0 に設定されます;

例:

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

実行結果は次のとおりです:

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

fd = 3 理由は次のとおりです:

内部 PCB に

ファイル テーブルがあります。システムの、レコードで開かれたファイル、ファイル記述子は実際にはファイルテーブル

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

    #0——FILE* stdinの添え字です。標準入力
  • 1——FILE* stdout、標準出力
  • 3——FILE* stderr、標準エラー出力
  • このプログラムはデフォルトで 3 つのファイルを開きます。fd は 4 番目にランク付けされているため、番号は 3
次に、ファイルを読み取ります

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法#実行結果は次のとおりです:

#アプリケーション: 読み取りと書き込みを使用してファイルをコピーしますLinux オペレーティング ファイルの基盤となるシステムを呼び出す方法

最初のステートメント: テキスト ファイルとバイナリ ファイルを区別しません。

画像のコピーを完了するには、次の解決策を使用できます。

元のバイナリ ファイルを最初に
  • #新しいファイルを開きます

  • #元のバイナリ ファイルの一部を読み取り、新しいファイルに書き込みます
  • # #読み込みと書き込みを繰り返す
  • 読み込みが完了するまで、書き込み後に停止 [read() == 0をループ停止条件とし、読み込めない場合は終了]
  • コピーが完了しました

コピーが完了しましたLinux オペレーティング ファイルの基盤となるシステムを呼び出す方法

ファイルを開いた後、フォーク共有の子プロセスは親プロセスと同じファイルにアクセスできますか? Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

#ファイルを開くたびに、開いているファイルを表す構造ファイルなどの構造がカーネル内に生成され、次の情報が記録されます。

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

ファイル オフセット (0 から始まり、データが書き込まれるにつれてファイル ポインター オフセットが変化します)

  • 参照カウント (このオープン ファイルを複数のプロセスが使用しています)

  • #inode ノード (プロセスの属性情報、つまり作成者、名前、ディスク上のどこに保存されているかを保存します。この i ノードを通じて、対応する特定のファイルを見つけることができます)

  • 開く方法: たとえば、読み取り専用モード、書き込み専用モードで開く

  • テスト 1: 最初にファイルを開きます。そして一番外側にfork

close(fd)と書くと親プロセスと子プロセスが両方とも閉じられます。参照カウントは 0 になるまで 1 ずつ減らされます。

実行結果は次のとおりです。 Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

理由は次のとおりです。

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

テスト 2: 最初にフォークしてからファイルを開きます

Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

コードを変更すると、実行結果は次のように変わります。

親プロセスと子プロセスは分離後に独自のファイルを開き、独自の構造体ファイルが生成され、ファイル オフセットは共有されなくなりました。

実際のアプリケーション シナリオでは、ほとんどの場合、親プロセスと子プロセスによって開かれたファイルを使用してこのフォームにアクセスします。 Linux オペレーティング ファイルの基盤となるシステムを呼び出す方法

以上がLinux オペレーティング ファイルの基盤となるシステムを呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。