Open/read/write/closeなどのファイル関連システム呼び出しインタフェースを練習し、fdとFILE構造体を縦に比較する


open
#include
#include
#include

int open(const char *pathname,int flags);
int open(coonst char *pathname,int flag,mode_t mode);
pathname:           
flags:     ,          ,            “ ”  ,  flags
      :
        O_RDONLY  O_WRONLY  O_RDWR   :  ,   
                         ,             
        O_CREAT  :       ,    ,    mode  ,           

write
size_t write(int fd,const void *buf,size_t nbyte)
  :
    fd:     
    buf:      ,       
    nbyte:           
   :
             ,    -1

read
size_t read(int fd,const void *buf,size_t nbyte)
  :
    fd:     
    buf:      
    nbyte:           
   :
                (           ),              ,            (          ,               ,  read()     ),       -1

close
int close(int fd);
  :
    fd:     
   :
        0,    -1
  • fd:ファイル記述子(OS層)
    fdは整数にすぎずopen時に生成される.インデックスとして機能し、プロセスはPCBのファイル記述子テーブルを介してfdが指すファイルポインタfileを見つけるため、Linuxシステムの下で、ファイル記述子は主にファイルを識別するために使用される.カーネルはファイルオブジェクトテーブルによってシステム内の様々なファイルを管理し、ファイルテーブルはポインタによって開いたファイルを指し、さらにファイルシステム全体を管理する目的を達成する.
       FILE:    (lib , C )
    

    CではファイルポインタをI/Oのハンドルとして使用し、ファイルポインタはプロセスのユーザ空間のFILE機構体を指す.
  • //C                    
    int fileno(FILE * stream)
    FILE * fdopen(int fd, const char * mode)
    
    struct _iobuf {
        char *_ptr;          //       
        int   _cnt;
        char *_base;         //     
        int   _flag;         //      
        int   _file;         //     
        int   _charbuf;      //         
        int   _bufsiz;       //     
        char *_tmpfname;
    };
    typedef struct _iobuf FILE;