ログ日記

作業ログと日記とメモ

lsコマンドの内部動作

メモ。

DIR *opendir()
  __open64 (name, O_RDONLY|O_NDELAY|EXTRA_FLAGS)
    sys_open()
      filp_open()
        open_namei()
          path_lookup()
            link_path_walk() // スラッシュで区切られた各トークンに対してdo_lookup()
              do_lookup()
                real_lookup()
                  down(&dir->i_sem) <- down
                  d_lookup()
                  if (キャッシュが見つからない場合){
                  d_alloc()
                  i_op->lookup()    <--- fs ---
                  }
                  up(&dir->i_sem)   <- up
          __lookup_hash()
            d_alloc()
            i_op->lookup()    <--- fs ---
          i_op->follow_link() // リンクの場合
        dentry_open()
          f_op->open()        <--- fs ---
      fd_install()

struct dirent *readdir()
  __GETDENTS (dirp->fd, dirp->data, maxread);
    sys_getdents()
      vfs_readdir()
        down(&inode->i_sem)   <- down
        f_op->readdir()       <---
        up(&inode->i_sem)     <- up

gobble_file (const char *name, enum filetype type, int explicit_arg,
             const char *dirname)
  int stat(const char *path, struct stat *buf); 
  int fstat(int filedes, struct stat *buf); 
  int lstat(const char *path, struct stat *buf);
    // ディレクトリに含まれるファイルそれぞれに対して行われる
    vfs_stat()
      user_path_walk()
        path_lookup()
      vfs_getattr()
        i_op->getattr(mnt, dentry, stat) <--- fs ---