ファイル共有の実装方法

2329 ワード

1、ファイル共有とは
(1)ファイル共有とは、同じファイル(同じファイルは同じinode、同じpathnameを指す)が複数の独立した読み書き体(ほぼ複数のファイル記述子と理解できる)によって同時に(1つが開いて閉じられていないと同時に別の操作が行われる)操作である.
(2)ファイル共有の意味はいろいろあります.例えば、ファイル共有によって、同じ大きなファイルを同時に操作することで、ファイルの読み書き時間を短縮し、効率を向上させることができます.
2、ファイル共有の3種類の実現方式
(1)ファイル共有の核心は,複数のファイル記述子が同じファイルを指す方法である.
(2)一般的な3種類のファイル共有の場合:1つ目は同じプロセスでopenを複数回使用して同じファイルを開くことであり、2つ目は異なるプロセスでopenを使用して同じファイルを開くことであり(この場合、2つのfdは異なるプロセスにあるため、2つのfdの数字は同じでも異なってもよい)、3つ目は後で学ぶことである.linuxシステムはdupとdup 2の2つのAPIを提供し、プロセスにファイル記述子をコピーさせる.
(3)我々がファイル共有を分析する際の核心的な注目点は、それぞれ書く/読むか、それとも継続するかである.
3、再論文書記述子
(1)ファイル記述子の本質は1つの数字であり、この数字は本質的にプロセステーブル中のファイル記述子テーブルの1つのテーブル項目であり、プロセスはファイル記述子をindexとしてインデックスしてテーブルを調べてファイルテーブルポインタを得、さらに間接的にこのファイルに対応するファイルテーブルにアクセスする.
(2)ファイル記述子という数字はopenシステム呼び出し内部でオペレーティングシステムによって自動的に割り当てられ,オペレーティングシステムがこのfdを割り当てる場合も勝手に割り当てるのではなく,一定の法則に従うものであり,今からこの法則を研究する.
(3)オペレーティングシステムは,fdが0から順次増加することを規定している.fdにも最大の制限があり、linuxの初期バージョン(0.11)ではfdが最大20だったため、1つのプロセスで最大20ファイルを開くことができた.linuxではファイル記述子テーブルは配列(チェーンテーブルではない)なので、このファイル記述子テーブルは実は配列であり、fdはindexであり、ファイルテーブルポインタはvalueである.
(4)openに行くと、カーネルはファイル記述子テーブルから使用されていない最小の数字を選択して返します.つまり、前にfdが0-9を占めていたら、次のopenで得たのはきっと10に違いない.(しかし、前のfdが9を得た場合、次のfdは必ずしも10ではない.これは、前のより小さいfdがcloseによって解放された可能性があるからである)
(5)fdでは0,1,2がデフォルトでシステムによって占有されているため,ユーザプロセスで得られる最小のfdは3である.
(6)linuxカーネルが0,1,2の3つのfdを占有することは有用であり、1つのプログラムを実行してプロセスを得ると、内部ではデフォルトで3つのファイルが開かれ、この3つのファイルに対応するfdは0,1,2である.この3つのファイルはそれぞれstdin、stdout、stderrと呼ばれています.つまり、標準入力、標準出力、標準エラーです.
(7)標準入力は一般にキーボード(0と理解できるfdはキーボードのデバイスファイル)であり、標準出力はLCDディスプレイ(1 LCD対応デバイスファイルと理解できる)である
(8)printf関数は,標準出力stdoutにデフォルトで出力される.stdioにはfpirntfという関数があり、この関数はどのファイル記述子に出力するかを指定することができます.
#include 
#include 
#include 
#define FILENAME "1.txt"
int main(void)
{
	FILE *fp = NULL;
	size_t len = -1;
	int array[10] = {1,2,3,4,5};
	char buf[100] = {0};

	fp = fopen(FILENAME,"r+");
	if(NULL == fp)
	{
		perror("fopen");
		exit(-1);
	}
	printf("fopen success. fp = %p.
",fp); //len = fwrite(array,sizeof(int),sizeof(array)/sizeof(array[0]),fp); //printf("len = %lu
",len); memset(buf,0,sizeof(buf)); len = fread(buf,1,10,fp); printf("read len = %lu,buf = [%s]
",len,buf); return 0; }