!!!C 低水準ファイルアクセス [Programming C] !file descriptor ,file descriptor,関連付け ,0,標準入力 ,1,標準出力 ,2,標準エラー !write #include ssize_t write(int filedes, const void *buf, size_t nbytes); file descriptor 'filedes' に関連付けられた File に buf から最初の'nbytes' byteを書き込み、実際に書き込まれたbyte数を返す。 *戻り値が0の場合には、データが書き込まれなかったことをあらわす。 *戻り値が-1の場合には、エラーが発生したことを表す。 *global変数errnoにエラーの内容を示す値が設定される。 #include int main() { if (write(1, "Here is some data\n",18) != 18) { write(2, "A write error has occured on file descriptor 1\n", 48); } exit(0); } !read #include ssize_t read(int filedes, void *buf, size_t nbytes); file descriptor 'filedes'に関連付けられた file から、'nbytes' byte までのdataを data area 'buf' に読み込み、実際に読み込んだbyte数を返す。 *read が 0 を返す場合には、読み取るものがないことを意味する。 *errorが発生した場合、-1を返す #include int main() { char buf[128]; int nread; nread = read(0, buf, 128); if (nread == -1) { write(2, "A read error has occured\n", 26); } if ((write(1, buf, nread)) != nread) { write(2, "A write error has occured\n", 27); } exit(0); } !open #include #include #include int open(const char *path, int oflags); int open(const char *path, int oflags, mode_t mode); 新しい file descriptor を作成するには、open system call を使う必要がある。 *呼び出しが成功した場合には、file descriptor を返す *失敗すると、-1をかえし、global変数のerrnoに値を設定 *返された file descriptor は、read や write で利用できる。 *Openするfileまたは、device は、'path' parameterに指定する。 *Parameter 'oflags'には、file を open するときの動作を指定する。 file access mode 必須 ,mode,説明 ,O_RDONLY,読み取り専用 ,O_WRONLY,書き込み専用 ,O_RDWR,読み書き用 file access mode との bit 単位の論理和によって oflags に指定できる省略可能なmode ,mode,説明 ,O_APPEND,file の最後に追加 ,O_TRUNC,file の長さを 0 に切り詰め、既存の内容を破棄 ,O_CREAT,必要に応じて、mode で指定された permission で file を作成 ,O_EXCL,O_CRETとともに指定された場合、既にfileが存在していればopenは失敗。 ::初期permission open に O_CREAT flag を指定して file を作成する場合には、parameterを3つ指令する必要がある。3つ目の parameter の mode には、sys/stat.h header file で定義されている flag(以下参照) の bit 単位の論理和を指定。 ,flag,内容 ,S_IRUSR,owner の読み取り permission ,S_IWUSR,owner の書き込み permission ,S_IXUSR,owner の実行 permission ,S_IRGRP,group の読み取り permission ,S_IWGRP,group の書き込み permission ,S_IXGRP,group の実行 permission ,S_IROTH,その他 user の読み取り permission ,S_IWOTH,その他 user の書き込み permission ,S_IXOTH,その他 user の実行 permission #include #include #include int main() { int out; out = open("file.out", O_CREAT, S_IRUSR|S_IWUSR|S_IROTH); } -rw----r-- 1 root root 0 9月 9 20:10 file.out ::umask file 作成時に使用される system 変数で、file permission の mask をあらわす。 *open または create を呼び出して file を作成する場合、mode parameter と umask の値が比較され、mode で指定されているbitのうち、umask でもセットされているbitがclearされる。 *3桁の8進数を指定する ,桁,内容 ,1桁目,userのpermission ,2桁目,groupのpermission ,3桁目,他のuserのpermission ,値,内容 ,0,permissionを許可 ,4,読み取りpermissionを不許可 ,2,書き込みpermissionを不許可 ,1,実行permissionを不許可 !close #include int close(int filedes); close system call は、file descriptor filedes と file との関連付けを終了する。 *成功した場合、0を返し、エラーが発生した場合、-1を返す。 !ioctl #include int ioctl(int filedes, int cmd, ...); ioctlは何でも屋的な関数で、device と その descriptor の振る舞いを制御したり、device が提供する service を設定するための interface を提供する。 *さまざまなdeviceでそれぞれ独自の呼び出しが定義されている。 !!file 操作のためのその他の system call !lseek #include #include out_t lseek(int filedes, off_t offset, int whence); file descriptor の読み取り/書き込みpointerをsetします。 *次にfileの読み取り/書き込み位置を指定することができる。 *pointerはfaile内の絶対一か、現在の位置またはfileの最後からの相対位置を設定できる。 *parameter offset には位置を指定し、whenceには offsetの以下の意味を指定 **SEEK_SET offset は絶対位置 **SEEK_CUR offset は現在位置から相対 **SEEK_END offset はfileの末尾から相対 #include #include #include #include int main() { char c; int in, out; in = open("file.in", O_RDONLY); while(read(in, &c, 1) ==1) { write(1, &c, 1); lseek(in, 1, SEEK_CUR); } exit(0); } !fstat, stat, lstat #include #include #include int fstat(int filedes, struct stat *buf); int stat(const char *path, struct stat *buf); int lstat(const char *path, struct stat *buf); *fstatは openされたfile descriptorに関連付けられているfileのstatus情報を返す。 *statとlstatは、指定された名前のfileに関するstatus情報を返す。 *file が symbolic linkの場合、lstatはlinkそれ自体、statはlinkが指し示すfileの情報を返す。 構造体statのmember ,member,説明 ,st_mod,fileのpermission情報 ,st_ino,fileに関連付けられたi-node ,st_dev,fileが存在するdevice ,st_uid,fileのownerのuser id ,st_gid,fileのownerのgroup id ,st_atime,最終access時刻 ,st_ctime,mode、owner、group、または内容の最終変更時刻 ,st_mtime,内容の最終修正時刻 ,st_nlink,fileへのhard linkの数 !dup, dup2 #include int dup(int filedes); int dup2(int filedes, int filedis2); *dup は file descriptor を複製し、同じfileに異なる複数のfile descriptor で access できるようにする。 *dup2 は file descriptor を copy する。 ---- この本からの覚書。 {{amazon 4797327014}}