ファイルIOプログラミング
ファイルIOでは、ファイル記述子を使用して開いているファイルを表し、通常のファイル、デバイスファイル、パイプラインファイルなどのさまざまなタイプのファイルにアクセスできます。
1.ファイルの開閉
函数原型:int open(const char *pathname, int flags, int perms)
函数参数:pathname 被打开的文件名
flags 文件打开的方式
perms 新建文件的存取权限
函数返回值:成功---返回文件描述符;失败--- -1
フラグ値 | 値の説明 |
---|---|
O_RDONLY | ファイルを読み取り専用で開く |
O_WRONLY | ファイルを書き込み専用モードで開く |
O_RDWR | 読み取りと書き込みのためにファイルを開く |
O_CREAT | ファイルが存在しない場合は、新しいファイルを作成し、permsパラメーターを使用してそのファイルのアクセス許可を設定します |
O_EXCL | O_CREATの使用時にファイルがすでに存在する場合、エラーメッセージが返される可能性があります |
O_NOCTTY | 端末ファイルが開かれている場合、割り込みは現在のプロセスの制御端末にはなりません |
O_TRUNC | ファイルが存在する場合、ファイル内の元のデータは削除され、ファイルサイズは0に設定されます |
O_APPEND | ファイルを書き込むとき、ファイルの読み取りと書き込みの位置は自動的にファイルの末尾を指します |
函数原型:int close(int fd)
函数参数:fd 文件描述符
函数返回值:成功--- 0;失败--- -1
2.ファイルの読み取りと書き込み
函数原型:ssize_t read(int fd, void *buf, size_t count)
函数参数:fd 文件描述符
buf 指定存储器读出数据的缓冲区
count 指定读出的字节数
函数返回值:成功---读到的字节数;出错--- -1; 到达文件尾--- 0
函数原型:ssize_t write(int fd, void *buf, size_t count)
函数参数:fd 文件描述符
buf 指定存储器写入数据的缓冲区
count 指定写入的字节数
函数返回值:成功---已写的字节数;出错--- -1;
3.ファイルの場所
lseek()関数は、ファイルの現在の読み取りおよび書き込み位置を見つけます。検索可能な(ランダムにアクセス可能な)ファイルのみを操作できます。パイプ、ソケット、およびほとんどのキャラクターデバイスファイルは、そのような操作をサポートしていません。
函数原型:off_t lseek(int fd, off_t offset, int whence)
函数参数:fd 文件描述符
offset 相对于基准值的偏移量,以字节为单位,正数表示向前移动,负数表示向后移动
whence 基准值
-->SEEK_SET 代表文件起始位置
-->SEEK_END 代表文件结束位置
-->SEEK_CUR 代表文件当前读写位置
函数返回值:成功---文件当前读写位置;失败--- -1
4.ファイルロック
複数のプログラムが共有ファイルで一緒に動作する場合、ファイルはロックされて、共有リソースの競合を解決します。
函数原型:int fcntl(int fd, int cmd, struct * flock)
函数参数:fd 文件描述符
cmd -->F_GETLK:检测文件锁状态
-->F_SETLK:设置lock描述的文件锁
-->F_SETLKW:F_SETLK的阻塞版本
-->若无法获取锁,会进入睡眠状态;若可以获取锁或捕捉到信号则会返回
flock 如果cmd和锁操作有关,则需要使用该参数
函数返回值:成功--- 0;失败--- -1
flock 结构体定义
struct flock{
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}
群れ構造 | 各メンバーの意味 |
---|---|
l_type | F_RDLCK:読み取りロック(共有ロック) |
F_WRLCK:書き込みロック(排他ロック) | |
F_UNLCK:ロック解除 | |
l_start | ファイル内のロックされた領域の相対変位(バイト)は、l_whenceとともに、ロックされた領域の実際の位置を決定します |
l_whence | SEEK_SET:現在の位置はファイルの先頭であり、新しい位置はオフセットのサイズです |
SEEK_CUR:現在の位置はファイルポインターの位置で、新しい位置は現在の位置とオフセットの合計です | |
SEEK_END:現在の位置はファイルの終わりであり、新しい位置はファイルの長さとオフセットの合計です | |
l_len | ロックされた領域の長さ |
l_pid | 現在のプロセスをブロックするロックを使用すると、保持プロセスのプロセス番号はl_pidに格納され、F_GETLKによってのみ返されます |
ファイル全体をロックするには:l_start = 0; l_whence = SEEK_SET; l_len = 0