Linux オペレーティング システムは、すべてがファイルであるという概念を追求しており、ほとんどすべてのファイル デバイスは、open()/close()/write()/read() などの一連のシステム コールで操作できます。システム コールは、オペレーティング ファイルの C ライブラリ コールに似ています。 Linux に付属のマニュアルが最も信頼できます。システムコールの使用状況はマニュアルを確認してください。
コード名—— 意味
open() の下のサブディレクトリにあるヘッダー ファイルです——ファイルを開くか作成します
戻り値のタイプ:
int——ファイル記述子 fd。ファイルが開かれるたびに、ファイル記述子が取得されます。このファイル記述子は整数です。ファイル記述子を通じて読み取りおよび書き込み操作を実行します。失敗: -1
mode_t は型のエイリアスで、実際には符号付き整数です。open 関数の場合、3 番目のパラメータは新しいファイルを作成する場合にのみ使用されます。
注:
これらは実際に定義されたマクロです。複数のパラメータを使用する必要がある場合は、ビット単位または " |" を使用して複数のパラメータを形成しますflag パラメータ は、次のメソッドと一緒に使用することもできます:
##その他はいちいち紹介しませんので、必要な場合はご自身でご確認ください。
write()
戻り値:
成功すると、書き込まれたバイト数 入力されたバイト数;
エラーが発生した場合は -1;
注: 書き込まれる予定のバイト数書き込みと関数の戻り値が等しくない場合は、書き込みエラーがあることを意味し、書き込みが成功したかどうかを確認するために使用できます;
fd
: ファイルを書き込むためのファイル記述子;buf
count
注:
read()
戻り値: 読み取ったバイト数
Ifファイルの終わりに達した場合は 0、エラーがある場合は -1、
fd : ファイルを読み取るためのファイル記述子;
buf
: 読み取りデータを保存するためのキャッシュ;
#count: データを 1 回読み取るのに必要なバイト数。戻り値は実際に読み取られたバイト数であり、同じではないことに注意してください。
注: 読み取り操作は、ファイルの
現在のディスプレイスメントから開始されます
注: プロセスが終了すると、プロセスが開いたすべてのファイルはカーネルによって自動的に閉じられます。 注: これらの キャッシュなしの関数 は、カーネルによって提供されるシステム コールです。これは、C 言語で学習した IO とまったく同じです。操作は異なります。これらは標準 C の一部ではなく、POSIX の一部であるという点です。 標準 C がファイルを操作する場合、FILE の構造体ポインターを操作し、ここでファイル記述子が使用されます。 ファイル記述子の範囲は 0 ~ OPEN MAX です。初期の Unix で採用されていた上限は 19 でした (つまり、各プロセスは 20 個のファイルを開くことができます)。現在、多くのシステムはまもなく 63 まで増加します。Linuxが 1024 である場合、特定の番号は ファイル記述子とファイル ポインター 関数: 開いているファイルを見つけます
lseek function
off_t lseek(int fd,off_t offset,int whence);
fd :開かれたファイル記述子;
offset: 変位量;
whence :配置位置、つまり基準点
SEEK_SET: ファイルの先頭からのオフセット バイトにファイルの変位を設定します。
SEEK_CUR: ファイルのディスプレイスメントを現在の値にオフセットを加えた値に設定します。オフセットは正または負にすることができます。
SEEK_END: ファイルの変位をファイルの長さにオフセットを加えた値に設定します。オフセットは正または負の値にすることができます (この時点で正の値の場合は、ホール ファイルが関係しています。以下の説明を参照してください)。
ホール ファイルの例:
#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; }次のことができますmore コマンドを使用して表示することを確認してください ファイルの内容を確認すると、表示された内容が 1 回の書き込みの結果にすぎないことがわかります。od-c コマンドを使用して、ファイルの ASSCI コードを表示します。 2 つの内容の間に \0 が 10 個あることがわかります。これは空です。vim でファイルを開くと、ファイルの内容も確認できます。^@ 文字が 10 個あります。 注: 各ファイルには「現在のファイル オフセット」が関連付けられています。これは、ファイルの先頭から計算されたバイト数を示す負ではない整数です。通常、読み取りおよび書き込み操作はファイルの現在のオフセットから始まり、読み取りまたは書き込みのバイト数だけオフセットを増やします。システムのデフォルトでは、ファイルが開かれるとき、O_APPEND オプションが指定されていない限り、ファイル オフセットは 0 に設定されます;
例:
実行結果は次のとおりです: fd = 3 理由は次のとおりです: 内部 PCB に
ファイル テーブルがあります。システムの、レコードで開かれたファイル、ファイル記述子は実際にはファイルテーブル
#実行結果は次のとおりです:
#アプリケーション: 読み取りと書き込みを使用してファイルをコピーします
最初のステートメント: テキスト ファイルとバイナリ ファイルを区別しません。画像のコピーを完了するには、次の解決策を使用できます。 元のバイナリ ファイルを最初にコピーが完了しました
ファイルを開いた後、フォーク共有の子プロセスは親プロセスと同じファイルにアクセスできますか?
#ファイルを開くたびに、開いているファイルを表す構造ファイルなどの構造がカーネル内に生成され、次の情報が記録されます。ファイル オフセット (0 から始まり、データが書き込まれるにつれてファイル ポインター オフセットが変化します)
参照カウント (このオープン ファイルを複数のプロセスが使用しています)
テスト 1: 最初にファイルを開きます。そして一番外側にfork
close(fd)と書くと親プロセスと子プロセスが両方とも閉じられます。参照カウントは 0 になるまで 1 ずつ減らされます。
実行結果は次のとおりです。
理由は次のとおりです。
テスト 2: 最初にフォークしてからファイルを開きますコードを変更すると、実行結果は次のように変わります。
親プロセスと子プロセスは分離後に独自のファイルを開き、独自の構造体ファイルが生成され、ファイル オフセットは共有されなくなりました。
実際のアプリケーション シナリオでは、ほとんどの場合、親プロセスと子プロセスによって開かれたファイルを使用してこのフォームにアクセスします。
以上がLinux オペレーティング ファイルの基盤となるシステムを呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。