Liunxシステムプログラミングにおけるopen(),close(),lseek(),write(),read()および関連例
5137 ワード
Linuxシステム呼び出しレベルの関数はたくさんありますが、ここではopen()、close()、lseek()、write()、read()関数のみを説明します.
Open()プロトタイプ
int open(const char *pathname,flags,intperms)
パラメータ定義:
pathname:パス名、例:「/tmp/working/open.c」
flags:ファイルの開き方.
O_RDONLY:読み取り専用モード
O_WRONLY:書き方のみ
O_RDWR:読み書き方式の3つは同時に存在しない
O_CREAT:オープンがない場合はパスの下にファイルがありません.c,openを作成する.cファイル.
O_EXCL:O_を使ったらCREATというパラメータがファイルに存在する場合、エラーが返されます.
O_NOCTTY:
O_TRUNC:ファイルが存在し、読み取り専用または書き込みのみで正常に開くと、ファイルのデータが削除されます.
O_APPEND:追加でファイルを開き、ファイルを開くと同時にファイルポインタがファイルの末尾を指します.
perms:開いているアクセス権限.
戻り値:成功:ファイル記述子
失敗:-1
close()プロトタイプ:
int close(int fd)
fdはファイル記述子でありopen()関数の戻り値である.
戻り値:成功:0
失敗:-1
上のプログラムはファイルを開く役割を果たし、なければ作成します.
read()関数
プロトタイプ:ssize_t read(int fd,void *buf,size_t count)
fd:ファイル記述子
buf:メモリ読み出しデータのキャッシュ領域を指定する
count:読み出しバイト数を指定
戻り値:
成功:読み込まれたバイト数.
0:ファイルの最後に達しました
-1:エラー
write()関数
プロトタイプ:ssize_t write(int fd,void *buf,size_t count)
fd:ファイル記述子
buf:メモリ書き込みデータのバッファを指定する
count:読み出しバイト数を指定
戻り値:
成功:書き込み済み文字数
-1:エラー
lseek:
プロトタイプ:off_t lseek(int fd,off_t offset,int whence)
fd:ファイル記述子
offset:オフセット量、単位はバイトで、正負可能です.
whence:
SEEK_SET:ファイルヘッダ
SEEK_CUR:でもお金の位置
SEEK_END:ファイルの末尾
戻り値:成功:ファイルの現在位置
-1:エラー
write.cファイル
上のプログラムは、bufの内容を書き込むファイルを作成します.
read.cファイル
ここでlen=lseek(fd,0,SEEK_END);
これはファイルの長さをテストするプログラムです.
Open()プロトタイプ
int open(const char *pathname,flags,intperms)
パラメータ定義:
pathname:パス名、例:「/tmp/working/open.c」
flags:ファイルの開き方.
O_RDONLY:読み取り専用モード
O_WRONLY:書き方のみ
O_RDWR:読み書き方式の3つは同時に存在しない
O_CREAT:オープンがない場合はパスの下にファイルがありません.c,openを作成する.cファイル.
O_EXCL:O_を使ったらCREATというパラメータがファイルに存在する場合、エラーが返されます.
O_NOCTTY:
O_TRUNC:ファイルが存在し、読み取り専用または書き込みのみで正常に開くと、ファイルのデータが削除されます.
O_APPEND:追加でファイルを開き、ファイルを開くと同時にファイルポインタがファイルの末尾を指します.
perms:開いているアクセス権限.
戻り値:成功:ファイル記述子
失敗:-1
close()プロトタイプ:
int close(int fd)
fdはファイル記述子でありopen()関数の戻り値である.
戻り値:成功:0
失敗:-1
#include
#include
#include
#include
#include
#include
int main()
{
intfd;
if((fd= open("./hello.txt" , O_CREAT | O_TRUNC | O_WRONLY , 0666)) < 0)
{
perror("open:");
exit(1);
}
else
{
printf("Openfile : hello.c %d
",fd);
}
if(close(fd) < 0 )
{
perror("close:");
exit(1);
}
else
{
printf("Closehello.c
");
}
exit(0);
}
上のプログラムはファイルを開く役割を果たし、なければ作成します.
read()関数
プロトタイプ:ssize_t read(int fd,void *buf,size_t count)
fd:ファイル記述子
buf:メモリ読み出しデータのキャッシュ領域を指定する
count:読み出しバイト数を指定
戻り値:
成功:読み込まれたバイト数.
0:ファイルの最後に達しました
-1:エラー
write()関数
プロトタイプ:ssize_t write(int fd,void *buf,size_t count)
fd:ファイル記述子
buf:メモリ書き込みデータのバッファを指定する
count:読み出しバイト数を指定
戻り値:
成功:書き込み済み文字数
-1:エラー
lseek:
プロトタイプ:off_t lseek(int fd,off_t offset,int whence)
fd:ファイル記述子
offset:オフセット量、単位はバイトで、正負可能です.
whence:
SEEK_SET:ファイルヘッダ
SEEK_CUR:でもお金の位置
SEEK_END:ファイルの末尾
戻り値:成功:ファイルの現在位置
-1:エラー
write.cファイル
#include
#include
#include
#include
#include
#include
#include
int main(void)
{
inti,fd,size,len;
char*buf="Hello world,I will write this file!";
if((fd= open("./hello.txt",O_CREAT | O_TRUNC | O_RDWR,0777 ))<0)
{
perror("open:");
exit(1);
}
else
printf("openhello.txt %d
:",fd);
len= strlen(buf);
if((size=write( fd , buf , len )) < 0 )
{
perror("write:");
exit(1);
}
else
printf("Write%s
",buf);
if(close(fd) < 0 )
{
perror("close:");
exit(1);
}
else
printf("Closehello.txt
");
exit(0);
}
上のプログラムは、bufの内容を書き込むファイルを作成します.
read.cファイル
#include
#include
#include
#include
#include
#include
#include
int main(void)
{
intfd,len,size;
charbuf_r[100];
//if((fd=open("./hello.c",O_CREAT| O_RDWR,0777))<0)
if((fd= open("./hello.txt",O_CREAT | O_RDWR,0777 ))<0)
{
perror("open");
exit(1);
}
else
printf("openthe file hello.txt
fd is %d
",fd);
len= lseek(fd,0,SEEK_END);
printf("lenis %d
",len);
lseek(fd,0,SEEK_SET);
if((size= read(fd,buf_r,len))<0)
{
perror("read");
exit(1);
}
else
{
buf_r[len]='\0';
printf("sizeis %d
",size);
printf("readfile is %s
",buf_r);
}
if(close(fd)<0)
{
perror("close");
exit(1);
}
else
printf("thefile is close
");
exit(0);
}
ここでlen=lseek(fd,0,SEEK_END);
これはファイルの長さをテストするプログラムです.