ホームページ  >  記事  >  システムチュートリアル  >  Linux でのファイル I/O プログラミング

Linux でのファイル I/O プログラミング

WBOY
WBOY転載
2024-03-30 21:31:11362ブラウズ
(1).open() ファイルを開きます
リーリー

パラメータ 1: pathname、ファイルが配置されているパス
パラメータ 2: フラグ、ファイル権限、プログラムプロセスに関連する
一般的なマクロは次のとおりです: O_WRONLY、O_RDONLY、O_RDWR、O_EXCL、O_APPEND、O_DUMP
パラメータ 3: ファイルの作成時に使用されるモード。通常は umask の値。
戻り値: ファイル記述子が正常に返され、それ以外の場合は -1.

が返されます。
(2) 閉じる、ファイルを閉じます。パラメータはファイル記述子
です。 リーリー
(3) write、ファイルへのデータの書き込み
リーリー

fd: ファイル記述子
buf: 書き込むデータを格納します
count: 書き込みの長さ (バイト単位) 戻り値: 書き込みに成功した場合は書き込んだ文字長を返し、そうでない場合は-1を返します。

(4) 読み取り、ファイル内のデータを読み取ります リーリー
fd: ファイル記述子

buf: 読み込むデータを格納します
count: 読み取られた長さ (バイト単位) 戻り値: 読み込みに成功した場合は読み込んだ文字長を返し、そうでない場合は-1を返します。
例えば:### #含む###

(5) lseek、ファイルオフセットの変更

リーリー
fd: ファイル記述子 offset: オフセットされるバイト数。 wherece: そこからのオフセット、マクロは次のように定義されます:
SEEK_END ファイルの終わり

SEEK_CUR 現在のオフセット位置
SEEK_SET ファイルの開始位置
注: オフセットがファイルの長さより大きい場合、ホールが生成されます。ホールは、設定されたオフセットがファイルの終端を超え、元のファイルの終端と新しいオフセット位置の間にあるデータを書き込むことによって発生します。 . それができた穴です。ホールはディスク領域を占有しないので使用できます:
リーリー ###例えば:### リーリー

(6) アクセスにより、ファイルが読み取り可能、書き込み可能、​​実行可能か、または存在するかどうかが決まります。 リーリー
パス名: ファイル名

モードでは次のマクロを選択できます:

F_OK ファイルは存在しますか

R_OK ファイルに読み取り権限があるかどうか
X_OK ファイルには実行権限がありますか W_OK ファイルには書き込み権限がありますか 戻り値: モードのパラメータが満たされ、正しく実行された場合は 0 を返し、それ以外の場合は -1 を返します。


(7) dup または dup2、同じファイル テーブルを指すファイル記述子を作成します

リーリー
oldfd: 元のファイル記述子
newfd: 新しいファイル記述子の値を指定します。記述がすでに存在する場合は、最初にそれを閉じます。oldfd が newfd と等しい場合、ze は閉じずに newfd を返します。
ファイルのカーネル構造について簡単に説明します: まず、コンピュータ システムにはプロセス テーブルがあります。各プロセス テーブル エントリには、オープン ファイル記述子テーブルがあります。オープン ファイル記述テーブルには、多くのファイル記述があります。記述子テーブル項目, 各アイテムには、ファイル記述子フラグとファイル ポインタの 2 つの部分が含まれます。ファイル ポインタはファイル テーブルを指します。ファイル テーブルには、ファイルのステータス フラグ (読み取り可能か書き込み可能か) と、ファイルのオフセットが格納されます。現在のファイルです。v ノード テーブルを指す v ノード ポインタもあります。v ノード テーブルには主に、ファイルの所有者、ファイルの長さ、ファイルのデバイス、場所などの一連の情報が格納されますディスク上のファイルの実際のデータ ブロック。この説明ではわかりにくいかもしれないので、図を使って説明しましょう:

(8) sync と fsync


(对于以下会主要是针对的内核缓冲)由于io操作会首先将数据放入内核缓冲区,所以在写的时候如果出现系统故障则缓冲区的数据可能会丢失,所以为了防止这种情况发生,以上两个函数使得内核缓冲区的数据立即写入磁盘。

#include
void sync(void);将所有缓冲排入写队列,然后立即返回
int fsync(int fd);将所有缓冲排入写队列,直到该缓冲去的数据写入磁盘后才返回。
int fdatasync(int fd);几乎和fsync函数相同,只是fdatasync(int fd)函数只影响数据部分,而fsync还会同步更新文件的属性。
(九)fcntl函数,该函数可以改变已经发开文件的性质
#include
#include
int fcntl(int fd, int cmd, ... /* arg */ );

fd:文件描述符
cmd 指明该函数执行什么功能
F_DUPFD 赋值文件描述符,功能相当于dup和dup2函数。例如:

dup(fd)等价于
fcntl(fd,F_DUPFD,0)
dup2(oldfd,newfd)等价于
close(newfd);
fcntl(oldfd,F_DUPFD,newfd);
F_GETFD 的到文件描述符标志,当前之定义一个文件描述符标志,FD_CLOSEEXEC.此时第三个参数被忽视。
F_SETFD 设置文件描述符标志,设置的值是函数的第三个参数,其一般可设置为0表示关闭,1表示打开。
F_SETFL 设置文件状态标志,其值放在函数的第三个参数,和open函数第二个参数的值一样的。
F_GETFL 得到文件状态标志。此时第三个参数被忽视。
arg 可选参数,根据第二个参数填写。
返回值:出错返回-1,否则哈返达到的标志。
例如:

#include
#include
#include
#include

int main(int argc,char * argv[])
{
int fd;
int val=3;
if( (fd = open(argv[1],O_RDWR|O_APPEND)) == -1 )//测试一下是否可以同时检测出文件的读写属性
{
exit(2);
}

if( val = fcntl(fd,F_GETFL,0) == -1 )
{
exit(1);
}
printf("%d\n",val);
printf("%d %d %d\n",O_RDONLY,O_WRONLY,O_RDWR);
int n = val & O_ACCMODE;

if( n == O_RDONLY)
printf("read\n");
if(O_WRONLY & val )
printf("write\n");
if( n == O_RDWR)
printf("read and write\n");
}
(十)最后再说一下Linux缓冲的问题吧

linux中有两个级别的缓冲:IO缓冲与内核缓冲

(1)IO缓冲:对于标准IO操作,都会有一个缓冲区,当用户想要写数据时,首先将数据写入缓冲区,待缓冲区满之后才能调用系统函数写入内核缓冲区。当用户想读取数据时,首先向内核读取一定的数据放入IO缓冲区,读操作从缓冲区中读数据,当读完IO缓冲区的数据时,才能再读取数据到IO缓冲区。

目的:减少对磁盘的读写次数,提高工作效率。

(2)内核缓冲区:操作系统内核部分也有缓冲,其与IO缓冲区是不同的,其主要区别用一张图表示:

Linux でのファイル I/O プログラミング

 

以上がLinux でのファイル I/O プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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