トップ 一覧 ping 検索 ヘルプ RSS ログイン

C 低水準ファイルアクセスの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!C 低水準ファイルアクセス

[Programming C]
!file descriptor

,file descriptor,関連付け
,0,標準入力
,1,標準出力
,2,標準エラー

!write
 #include<unistd.h>
 ssize_t write(int filedes, const void *buf, size_t nbytes);

file descriptor 'filedes' に関連付けられた File に buf から最初の'nbytes' byteを書き込み、実際に書き込まれたbyte数を返す。
*戻り値が0の場合には、データが書き込まれなかったことをあらわす。
*戻り値が-1の場合には、エラーが発生したことを表す。
*global変数errnoにエラーの内容を示す値が設定される。

 #include <unistd.h> 
 
 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 <unistd.h>
 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 <unistd.h>
 
 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 <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 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 <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
 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 <unistd.h>
 int close(int filedes);

close system call は、file descriptor filedes と file との関連付けを終了する。
*成功した場合、0を返し、エラーが発生した場合、-1を返す。

!ioctl
 #include <unistd.h>
 int ioctl(int filedes, int cmd, ...);
ioctlは何でも屋的な関数で、device と その descriptor の振る舞いを制御したり、device が提供する service を設定するための interface を提供する。
*さまざまなdeviceでそれぞれ独自の呼び出しが定義されている。

!!file 操作のためのその他の system call
!lseek
 #include <unistd.h>
 #include <sys/types.h>
 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 <unistd.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <fcntl.h>
 
 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 <unistd.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 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 <unistd.h>
 int dup(int filedes);
 int dup2(int filedes, int filedis2);

*dup は file descriptor を複製し、同じfileに異なる複数のfile descriptor で access できるようにする。
*dup2 は file descriptor を copy する。

----
この本からの覚書。
{{amazon 4797327014}}