linuxファイルプログラミング(1)

3138 ワード

linuxでのファイルプログラミングには2つの方法が使用できます:1.Linuxシステム呼び出し2.C言語ライブラリ関数.システム呼び出しはlinuxシステムに基づいており、システム間で使用できません.c言語ライブラリ関数は各システムで使用できます.まず、システム呼び出しに基づくファイルプログラミングについて説明します.
1.ファイルの作成
int creat(const char*filename,mode_t mode)filename:作成するファイル名(パスを含む、デフォルトは現在のパス)mode:作成モード
一般的な作成モード:S_IRUSR読み取り可能S_IWUSR書き込み可能S_IXUSR実行可能S_IRWXU読み取り、書き込み、実行
このいくつかのパターンはどのように記憶しますか?英語のフルネームで記憶できます.S_IRUSR:Set ID Read、これはユーザーの操作モードを設定し、後にUSRを追加します.l
上記のマクロに加えて、実行可能->1書き込み可能->2読み取り可能->4というファイルへのアクセス権を直接数値で表すこともできます.
上記の値の和、書き込み可能で読み取り可能な場合->6権限なし->0
それぞれのパーミッションは、バイナリの異なるビット数に対応します.左から右(上位から下位)に対応する順序は、読み取り--書き込み--実行であり、プログラムコードを変更するプロセス記憶、すなわち、コード(読み取り)、コード(書き込み)、コード(実行)を先に読むことと理解することができる.
インスタンスコード:
#include <stdio.h> 
#include <stdlib.h> 

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

void  create_file(char *filename){ 
	
    if(creat(filename,0755)<0){ 
        printf("create file %s failure!
",filename); exit(EXIT_FAILURE); }else{ printf("create file %s success!
",filename); } } int main(int argc,char *argv[]){ int i; if(argc<2){ perror("you haven't input the filename,please try again!
"); exit(EXIT_FAILURE); } for(i=1;i<argc;i++){ create_file(argv[i]); } exit(EXIT_SUCCESS); }

Linuxシステムでは、開いているすべてのファイルが1つのファイル記述子に対応します.ファイル記述子の本質は非負の整数です.ファイルを開くと、整数はシステムによって割り当てられます.ファイル記述子の範囲は0~OPEN_MAX .以前のUNIXバージョンOPEN_MAX=19は、プロセスごとに同時に20個のファイルを開くことを可能にし、多くのシステムが1024に追加します.
2.ファイルを開く
int open(const char*pathname,int flags)int open(const char*pathname,int flags,mode_t mode)pathname:開くファイル名(パスを含む、デフォルトは現在のパス)flags:開くフラグ
一般的なオープンフラグ:O_RDONLY読み取り専用方式ON O_WRONLYは書き込みのみでO_を開くRDWR読み書き方式オープンO_APPEND追加方式オープンO_CREATファイルO_を作成NOBLOCK非ブロック方式オープン
O_を使ったらCREATEフラグは、int open(const char*pathname,int flags,mode_t mode);この場合、modeを指定してファイルへのアクセス権を表す必要があります.
ファイルを操作した後、ファイルを閉じる必要があります:int close(int fd)
fdはファイル記述子であり、creatまたはopen関数からの戻り値である.
システムコール-int read(int fd,const void*buf,size_t length)機能:ファイル記述子fdが指定したファイルからlengthバイトをbufが指すバッファに読み出し、戻り値は実際に読み出したバイト数である.
システムコール-int write(int fd,const void*buf,size_t length)機能:bufが指すバッファからファイル記述子fdが指すファイルにlengthバイトを書き込み、実際に書き込まれたバイト数を返す.
システムコール-int lseek(int fd,offset_t offset,int whence)機能の位置決め:ファイル読み書きポインタをwhenceに対してoffsetバイト移動します.操作に成功すると、ファイルヘッダに対するファイルポインタの位置が返されます.
whenceは以下の値を使用できます:SEEK_SET:相対ファイル先頭SEEK_CUR:ファイル読み書きポインタの現在位置に対するSEEK_END:ファイル末尾offsetに対して負の値をとり、前へ移動することを示す.例えば、以下の呼び出しにより、ファイルポインタを現在位置に対して5バイト前に移動することができる:lseek(fd,-5,SEEK_CUR)
lseek関数の戻り値はファイルヘッダに対するファイルポインタの位置であるため、以下で呼び出す戻り値はファイルの長さである:lseek(fd,0,SEEK_END)
ファイルが何らかの操作(読み取り、書き込みなど)が可能かどうかを判断する必要がある場合、access関数:int access(const char*pathname,int mode)pathname:ファイル名mode:判断するアクセス権を使用することができます.以下の値またはそれらの組み合わせを取ることができます.
R_OK:ファイル読み取り可能、W_OK:ファイル書き込み可能、X_OK:ファイル実行可能、F_OKファイルが存在します.戻り値:テストに成功した場合、関数は0を返します.そうしないと、条件が一致しない場合は-1を返します.