UNIXシステムファイルIO

3854 ワード

基本的な知識:
カーネルの場合、開いているすべてのファイルはファイル記述子で参照されます.例えばLinuxアプリケーションプログラマーにとって、オーディオプログラミングインターフェースは、実際には、オーディオデバイスファイルのセットであり、サウンドカードからデータを読み取ることができたり、サウンドカードにデータを書き込むことができたり、サウンドカードを制御したり、サンプリング周波数やチャネル数を設定したりすることができる.
ファイルを読み書きする場合はopenまたはcreateで返されるファイル記述子を使用してファイルを識別し、readまたはwriteにパラメータとして転送します.
UNIXシステムshellは、ファイル記述子0を使用してプロセスの標準入力に関連付け、ファイル記述子1を標準出力に関連付け、ファイル記述子2を標準エラーに関連付けます.POSIXに準拠するアプリケーションでは、幻数0,1,2を定数に置き換える必要があります.
/* Standard file descriptors. */

#define STDIN_FILENO 0 /* Standard input. */

#define STDOUT_FILENO 1 /* Standard output. */

#define STDERR_FILENO 2 /* Standard error output. */

//defined in /usr/include/unistd.h。

1.open,creat-ファイルまたはデバイスを開いて作成する
説明:
int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode)

int creat(const char *pathname, mode_t mode);

Open()は、通常、パス名をファイル記述子(read、writeなどのI/O操作で使用する非負の小さな整数)に変換するために使用される.Open()呼び出しに成功すると、新しいファイル記述子(使用していない記述子の最小値を永遠にとる)が返されます.この呼び出しは、実行中の他のプログラムと共有することなく、新しいユニークなファイル記述子を割り当てる新しいオープンファイルを作成する(ただしfork(2)システム呼び出しにより共有することができる).この新しいファイル記述子は、その後のファイルを開く操作の関数で使用する.(fcntl(2)参照).ファイルの読み書きポインタがファイルヘッダパラメータflagsに置かれるのはO_RDONLY, O_WRONLYまたはO_RDWR(ファイルが読み取り専用、書き込み専用または読み書き方式で開かれていることを示す)と次の0個
または複数のオプションモードがビット-or操作で得られる(モードが多いので貼らず、直接manで見ればよいが、以上の説明もman 2 openからコピーされている).
create関数はopen(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode)に等しい.
2つの関数はは関数宣言を見つけることができます.
2.close関数はファイルを閉じるために使用されます.
説明:
#include <unistd.h>

int close(int fd);

プロセスが終了すると、カーネルは開いているすべてのファイルを自動的に閉じます.多くのプログラムはこの機能を利用してcloseでオープンファイルを明示的に閉じない.
3.lseek:ファイルオフセット量の設定
説明:
開くファイルごとに、それに関連付けられた「現在のファイルオフセット」(current file offset)があります.通常、ファイルの先頭から計算されるバイト数を測定するために非負の整数です.通常、読み取り、書き込みはファイルオフセットから開始され、O_が指定されていない限り、ファイルを開くAPPEND、そうでない場合、オフセット量は0に設定.
#include
off_t lseek(int fileds, off_t offset, int whence);
SEEK_SET
The offset is set to offset bytes.
SEEK_CUR
The offset is set to its current location plus offset bytes.
SEEK_END
The offset is set to the size of the file plus offset bytes.
開いているファイルの現在のオフセットを次のように決定できます.
off_t currpos = lseek(fd, 0, SEEK_CUR);
この方法は、関連するファイルがオフセット量を設定できるかどうかを決定するためにも使用できます.ファイル記述子がパイプ、FIFO、またはネットワークソケットを参照している場合、lseekは-1を返し、errnoをESPIPEに設定します.
lseekは、現在のファイルオフセット量のみをカーネルに記録し、IO操作を起こさない.次に、このオフセット量を次の読み書き操作に使用します.
4.read:開いているファイルからデータを読み込む
説明:
ssize_t read(int fd, void *buf, size_t count);
読み込みバイト数を正常に返し、ファイルの最後に0を返し、エラーが発生すると-1を返します.
5.write:開いているファイルにデータを書き込みます.
ssize_t write(int fd, const void *buf, size_t count);
コードの例:
標準入力から読み込み、標準出力まで書きます.
#include <unistd.h> 

#include <stdio.h>

#include <stdlib.h>

const int BUFFSIZE = 4096;

int main()

{

int n;

char buf[BUFFSIZE];

while ((n=read(STDIN_FILENO, buf, BUFFSIZE)) > 0)

if (write(STDOUT_FILENO, buf, n) != n) {

printf("write error
"
);

exit(1);

}

if (n < 0) {

printf("read error
"
);

exit(1);

}

exit(0);

}