1.ファイルカーネルデータ構造
三つは、カーネルデータ構造内のファイルを開く表します。
(1)ファイルディスクリプタテーブル
ファイルディスクリプタフラグ
ファイル・テーブル・エントリポインタ
(2)ファイルエントリ:
ファイルステータスフラグ:読み取り、書き込み、追記、および他の状態と、非ブロッキング同期マーク
現在のファイルオフセット
iノードテーブルエントリポインタ
参照カウンタ
(3)ノードi
ファイルの操作や関数ポインタファイルタイプ
現在のファイルの長さ
ファイルの所有者
デバイスファイルは、ファイルのアクセス権限に位置しています
そのようなポインタ位置の位置として、ディスク上のデータファイルを指します。
2. 原子操作
開口ファイル使用O_APPENDのフラグは、文書データと追加オフセット調整のプロセスになるアトミック操作。
O_APPEND
書き込み(){//書き込みがアトミック動作になります
現在のオフセットとして1)ノードiの長さからファイルを読み取ります
ファイルへの2)書き込みデータ
文書ノードiの長さの3)変形例
}
カーネルの書き込み前にファイルたびに、現在のプロセスがファイルの終わりなので、オフセットのlseekを調整する必要はありません用に設定されているオフセットします。
(2)ファイル作成:
オープンの機能O_CREAT O_EXCLと使用、ファイルが存在する場合、オープンは失敗し、そうでない場合は、ファイルが作成され、そしてファイルが存在すると判定されたとアトミックオペレーションの作成。
3. I / O処理
5つのモデル3.1 I / O処理
I / Oモデルをブロック:アクセス端末、ネットワーク機器:と呼ばれるI / O機能に関連する機能は、プロセスのハングアップを完了しない場合はデータが到着するまで、のような、戻りません。
ノンブロッキングモデル:要求されたI / O操作が完了できない場合、プロセスは休眠することはありませんが、エラーを返します。以下のような:オープン、読み取り、書き込みアクセス。
I / Oマルチプレクサモデル:I / O操作はブロックされ、要求され、それは本当にI / Oをブロックし、それらが機能するために待ってみましょう、この期間では、I / Oには、また、他の操作を、実行することができていない場合:選択機能。
駆動信号I / O機能は:このモードでは、プログラムをインストールすることにより、処理信号は、システムが自動的にそれによってI / Oを開始し、特定の信号の到着を捕捉します
非同期I / Oモデル:このモードでは、記述子は今より少なく使用するカーネルによる後続の処理のために、I / O、カーネルの通知プロセスを開始する準備ができています。
3.2 I / Oノンブロッキング
場合低速システムコール、プロセスはブロックすることができます
非ブロッキングI / O操作は(リード、オープン、書き込み)はブロックしない判定された操作が完了できない場合、エラーが返されます。
非ブロッキング方法の設定:1、ファイル、セットO_NONBLOCKフラグ開くために、ファイルを開くを使用して、ファイルが開かれている場合、ファイルは状態フラグのfcntlを変更するために使用され、2。
4.高度なファイル操作 - ファイルロック
共有への複数のユーザーが、ファイルを操作する場合、一般的に使用される方法は、競争を生成する共有リソースの状態を回避するために、Linuxのファイルロックを与えることです。
ファイルのロックが機能に分かれています:1、読んでロックを共有:オープンファイル記述子を読み取る必要があります。ファイルの読み取りロックを、他のプロセスも、読書のためのロックを読み取ることができます。2、排他的な書き込みロック:1、オープンファイル記述子を書き込む必要があります。プロセスの書き込みロック、他のプロセスが書き込みのロックのロックを読み書きすることはできません。
タイプロックファイルロックが推奨され、強制ロックで割った値。ロックロックされたファイルを推薦することががラッチされるべきかどうかを検出し、既存のロックを尊重するプロセスが必要です。強制ロックシステムとカーネルによって実行されます。
唯一の勧告を実施することができないのfcntlロックとは、強制ロックを実装することができます。
注4.1点ロックとアンロック領域
領域は、またはその後端から始まるファイルの現在の末尾を越えてではなく、ファイルの開始前または開始位置を超えて開始することができます。
SHOULD l_lenは0、最大の可能な位置までその開始点(l_startのとl_whence決定)からロック領域です。これは、範囲ロックであるどのくらいのデータTianxieへのファイルに関係なく、です。
ファイル全体をロックするには、通常の方法では0にl_startのセット、l_whenceセットSEEK_SET、ゼロにl_len設定することです。
4.2継承のロックと解除
プロセスの終了は、それはロックがリリースされている設立しました。
ファイルディスクリプタを閉じて、このプロセスはファイル上のすべてのロックが解除されなければなりません。
子供が親プロセスを継承しませんロック。
execを実行した後、新しいプロセスは、元のロックの実装プロセスを継承するかどうかを選択することができます。
メモリマップ
ディスクファイルのメモリ空間にメモリマップがキャッシュをマッピングされて、読み取りと書き込みのキャッシュデータは、完全な読み取りに対応し、ファイルを書き込みます。
5.1関数呼び出し
1の#includeは<sys / types.h>に 2の#includeは<sys / mman.h> 3 ボイド * MMAP(ボイド * ADDR、size_tの長さ、int型ポート、int型フラグ、int型の FD、オフセットoff_tでは)。
戻り値:成功した場合、マッピングされた領域の先頭アドレスと比較して、または-1場合にエラー
機能:I / Oディスクファイルとマッピングされたキャッシュメモリ空間を作ります。
1 int型と、munmap(無効 * addrは、size_tの長さ)。
戻り値:成功したリターン0、-1のエラー
機能:アンマップ
mmap関数は、キャッシュからデータを取得し、読み取りがファイル、これに類似の対応するバイトに相当し、バッファに格納されたデータは、対応するバイトは自動的にあなたがを使用せずに読み書きできるように、ファイルに書き込まれますI / Oを実行します
子供は、メモリマップされた領域の親プロセスを継承します。
パラメータ:
ADDR:メモリマップされた領域の開始アドレス、通常は0に設定し、流通システムをしましょう。
長さ:バイト数をマッピングします
オフセット:バイトマッピングファイル内のオフセット
PROT:マッピング領域をアクセス不可:読めるPROT_READマッピングエリア、PROT_WRITEのマッピング領域の書き込み可能な、PROT_EXECは、マッピング領域、PROT_NONEを行います
flags:MAP_FIXD返回地址必须等于addr,不推荐使用、MAP_SHARED存储操作立刻修改映射文件内容、MAP_PRIVATE存储操作导致创建映射文件的副本,并对副本读写。
6. 文件属性
struct stat是存放文件属性的结构体
1 struct stat{ 2 mode_t st_mode; //file type & permission 3 ino_t st_ino; //i-node number 4 dev_t st_dev; //device number(file system) 5 dev_t st_rdev; //device number for special files 6 nlink_t st_nlink; //number of links 7 uid_t st_uid; //user ID of owner 8 gid_t st_gid; //group ID of owner 9 off_t st_size; //size in bytes 10 time_t st_atime; //time of last access 11 time_t st_mtime; //time of last modification 12 time_t st_ctime; //time of last file status change 13 blksize_t st_blksize; //best I/O block size最佳块大小 14 blkcnt_t st_blocks; //number of disk blocks allocated 15 };
6.1 文件属性操作函数
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 int stat(const char *pathname, struct stat *buf); 4 int fstat(int fd, struct stat *buf); 5 int lstat(const char *pathname, struct stat *buf);
返回:若成功返回0,若出错则为-1
功能:返回一个与pathname或fd执行的文件属性信息,存储在结构体buf中。
参数:pathname:文件路径名称;buf:struct stat结构体指针。
lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。
6.2 文件类型
文件类型 判别函数
普通文件(regular file) S_ISREG()
目录文件(directory file) S_ISDIR()
块特殊文件(block special file) S_ISBLK()
字符特殊文件(character special file) S_ISCHR()
FIFO(named pipe) S_ISFIFO()
套接字(socket) S_ISSOCK()
符号链接(symbolic link) S_ISLNK()
6.3 文件权限
9种文件访问权限:
用户权限:S_IRUSR、S_IWUSR、S_IXUSR
组权限:S_IRGRP、S_IWGRP、S_IXGRP
其它权限:S_IROTH、S_IWOTH、S_IXOTH
文件权限通过按位或方式构造。
6.4 文件权限相关函数
1 #include <unistd.h> 2 int access(const char *pathname, int mode);
返回:成功执行返回0,若出错为-1
功能:检查是否可以对指定文件进行某种操作
参数:pathname:文件路径;
mode:文件访问权限:
R_OK:判断文件是否有读权限;
W_OK:判断文件是否有写权限;
X_OK:判断文件是否有可执行权限;
F_OK:判断文件是否存在。
(2)umask函数
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 mode_t umask (mode_t mode);
返回:以前的文件模式创建屏蔽字(掩码)
功能:为进程设置文件方式创建屏蔽字,并返回以前的值
参数:mode:文件权限常量(如:S_IRGRP、S_IWGRP等)
被umask设置过的权限不能再使用在创建文件的权限上。
(3)chmod和fchmod函数
1 #include <sys/stat.h> 2 int chmod(const char * pathname, mode_t mode); 3 int fchmod(int fd, mode_t mode);
返回:成功返回0,出错返回-1
功能:更改现存文件的权限。chmod函数在指定的文件上进行操作,而fchmod函数对已打开的文件进行操作。
参数:pathname:文件路径名字
mode:文件权限(按位或操作)
S_ISUID、S_ISGID、S_ISVTX
S_IRWXU、S_IRUSR、S_IWUSR、S_IXUSR
S_IRWXG、S_IRGRP、S_IWGRP、S_IXGRP
S_IRWXO、S_IROTH、S_IWOTH、S_IXOTH
想要改变一个文件的权限位,需满足条件:进程的有效用户ID必须等于文件的所有者ID或者进程具有超级用户权限。
(4)truncate和ftruncate函数
1 #include <sys/types.h> 2 #include <unistd.h> 3 int truncate(const char * pathname, off_t length); 4 int ftruncate(int fd, off_t length);
返回:成功返回0,出错返回-1
功能:文件截断
参数:pathname:文件路径名字;length:文件截断后的长度。
在文件尾端处截去一些数据以缩短文件。
将一个文件的长度截短为0是一个特例,用O_TRUNC标志可以做到这一点。
如果该文件以前的长度大于length,则超过length以外的数据就不再能存取。如果以前的长度短于length,则其后果与系统有关。
7. Linux文件系统结构
文件操作相关的最基本元素是:目录元素、索引节点和文件的数据本身。
目录结构(目录项)
索引节点(i节点)
文件的数据
(1)link和unlink函数
1 #include <unistd.h> 2 int link(const char *exitingpath, const char *newpath);
返回:成功返回0,出错返回-1
功能:创建一个指向现存文件连接(硬链接)
1 int unlink(const char *pathname);
返回:成功返回0,出错返回-1
功能:删除pathname指定的硬链接,并将由pathname所引用的文件链接计数-1
硬链接创建条件:针对文件创建链接,必须是同一个分区,只有超级用户才能对目录建立链接。
文件删除条件:链接计数为0,无其它进程打开该文件。
(2)remove和rename函数
1 #include <unistd.h> 2 int remove(const char * pathname);
返回:成功返回0,出错返回-1
功能:解除对一个文件或目录的链接
1 int rename(const char * oldname, const char * newname);
返回:成功返回0,出错返回-1
功能:文件或目录更名
对于文件,remove的功能和unlink相同
对于目录,remove的功能和rmdir相同
(3)symlink和readlink函数
1 #include <unistd.h> 2 int symlink(const char * actualpath, const char * sympath);
返回:成功返回0,出错返回-1
功能:创建一个符号链接(软链接)
1 int readlink(const char * restrict_pathname, char * restrict buf, size_t bufsize);
返回:成功返回读到的字节数,出错返回-1
功能:打开该链接本身,并读该链接中的名字
符号链接创建并不要求actualpath存在,可以跨文件系统建立符号链接,软链接也可以针对目录创建。
8. 文件时间
字段 |
说明 |
例子 |
ls选项 |
st_atime |
文件数据最后访问时间 |
Read |
-u |
st_mtime |
文件数据最后修改时间 |
Write |
默认 |
st_ctime |
i节点最后更改时间 |
chmod、chown |
-c |
(1)utime函数
1 #include <sys/types.h> 2 #include <utime.h> 3 int utime(const char * pathname, const struct utimebuf * times);
返回:成功返回0,出错返回-1
功能:更改文件的存取时间和修改时间
1 struct utimebuf{ 2 time_t actime; //access time 3 time_t modtime; //modification time 4 };
参数times:
空指针则读取当前时间:进程的有效用户ID必须等于文件的所有者ID,或者进程对该文件具有写权限
非空取times结构体中的时间:进程有效用户ID等于该文件的所有者的ID,或者进程是超级用户进程。
utime操作会自动更新st_ctime值。
9. 目录函数
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 int mkdir(const char * pathname, mode_t mode);
返回:成功返回0,出错返回-1
功能:创建目录
1 int rmdir(const char * pathname);
返回:成功返回0,出错返回-1
功能:删除目录
创建目录:创建一个新的空目录,.和..目录项是自动创建的。创建目录时,至少指定一个执行权限位。
目录删除条件:该目录的链接计数为2(只包含.和..),无其它进程打开目录。
(2)opendir、readdir、rewinddir和closedir函数
1 #include <sys/types.h> 2 #include <dirent.h> 3 DIR * opendir(const char * pathname);
返回:成功返回目录指针,出错返回NULL
功能:打开目录
1 struct dirent * readdir(DIR *dp);
返回:成功返回指针,若在目录结尾或者出错返回NULL
功能:读取目录
1 void rewinddir(DIR *dp);
功能:重新定位从头开始读取
1 int closedir(DIR *dp);
返回:成功返回0,出错返回-1
功能:关闭目录
1 struct dirent{ 2 ino_t d_ino; //i-node number 3 char d_name[NAME_MAX+1]; //null-terminated filename 4 };
1 #include <unistd.h> 2 int chdir(const char * pathname); 3 int fchdir(int fd);
返回:成功返回0,出错返回01
功能:分别用pathname或fd来指定新的当前工作目录
1 char *getcwd(char *buf, size_t size);
返回:成功返回buf,出错返回NULL
功能:获取当前工作目录的绝对路径名
当前工作目录是一个进程的属性,所以它只影响调用chdir的进程本身,而不影响其它进程。
问题:改变了路径是否会影响shell的当前路径?
不会影响。
10. 设备特殊文件
每个文件系统所在的存储设备都由主、次设备号表示;
major和minor宏可用来得到主、次设备号;
只有字符特殊文件和块特殊文件才有st_rdev值。