linux学習2

6800 ワード

レコードエントリ
記録項目は等しくない.レコードしたい(inode番号ファイル名サブファイルタイプ.ファイル長)
ファイルの種類は次のとおりです.
stat
#include 
       #include 
       #include 

       int stat(const char *path, struct stat *buf);
       int fstat(int fd, struct stat *buf);       
       int lstat(const char *path, struct stat *buf);


stat構造体
  struct stat {
               dev_t     st_dev;     /* ID of device containing file */
               ino_t     st_ino;     /* inode number  inode   */
               mode_t    st_mode;    /* protection */
               nlink_t   st_nlink;   /* number of hard links     */
               uid_t     st_uid;     /* user ID of owner 。       */
               gid_t     st_gid;     /* group ID of owner 。     */
               dev_t     st_rdev;    /* device ID (if special file) */
               off_t     st_size;    /* total size, in bytes       */
               blksize_t st_blksize; /* blocksize for file system I/O  block    */
               blkcnt_t  st_blocks;  /* number of 512B blocks allocated               4096   8 */
               time_t    st_atime;   /* time of last access          */
               time_t    st_mtime;   /* time of last modification         */
               time_t    st_ctime;   /* time of last status change        */
           };


この関数は主にファイルinodeのプロパティを取得します.
≪インスタンス|Instance|emdw≫
File: `rendd.me'
  Size: 9           Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 130854      Links: 1
Access: (0664/-rw-rw-r--)/*     */  Uid: (  500/zhangwenyong)   Gid: (  500/zhangwenyong)
Access: 2017-07-19 15:47:24.306000037 +0800/*       */
Modify: 2017-07-19 15:47:23.177000038 +0800/*                */
Change: 2017-07-19 15:47:23.178000035 +0800/*          inode    */


端末でこの関数を呼び出すとファイルのプロパティが取得されます
インスタンスの適用
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc,char *argv[]){

  struct stat s_buf;

  if(argc<2)
   {

  exit(1); 
    }

if( stat(argv[1],&s_buf))
   {
  perror("sss");
 
     exit(1); }

    printf("%s",argv[1]);

return 0;


}

*int main(int argc,char argv[])については、このようなargcはコマンドライン全体のパラメータ個数であり、ここで0番目のパラメータはプログラム名以降のパラメータであり、コマンドラインユーザが入力した消去argv[]は文字配列であり、int argc配列の各要素が1つのパラメータであるargcはユーザ入力パラメータを記録した個数argv[]は文字ポインタargv[0]であり、通常は実行可能ファイルのファイル名を指す
実行可能なプログラムを呼び出す場合、実行可能なプログラムにパラメータを入力する必要がある場合があります.例えば、コンソールにnotepadを入力します.exeは車に戻るとメモ帳を開きます.メモ帳プログラムを開くときに同時にメモ帳ファイルを開くにはnotepadが必要です.exeの後ろにメモ帳のファイルnotepadを追加します.exe ddda.txt(ファイルパス)では、ファイルはどのようにこれらの入力パラメータを得るのでしょうか.この仕事はコンパイラが私たちに入力したパラメータをmian関数のパラメータリストに置くmain関数が私たちの入力パラメータを保存した情報です.最初のパラメータargcはパラメータの個数を記録しました.2番目のパラメータは文字ポインタ配列でnotepadです.exe dd.txt . 例argcは2であるargv[]配列に2つのパラメータがある第1ユニットの郷はnoteappである.exe . 2番目のパラメータはdd.txtを指します
argv配列の最初のセルが指す文字列は常に実行可能なプログラムの名前であり,以降のセルが指す文字列はプログラム呼び出し時のパラメータの順である.
この付与プロセスはコンパイラで完了し、データを読み出すだけでいいです.
int fstat(int fd, struct stat *buf);この関数はパスをファイル記述子に変換します.パスをファイル記述子に変えました(ファイル記述子は何ですか?私の次の文章を見てください)
int lstat(const char *path, struct stat *buf); この関数はどういう意味ですか.これはシンボルリンクstatという関数がシンボルリンクを追跡しないことです.(ショートカット)
access
 #include 

       int access(const char *pathname, int mode);



この関数は,アクセス権限の有無を検出する実際のユーザid有効ユーザidである.
chmod
まだ見ていません------権限ビットを修正します.
link
 #include 

       int link(const char *oldpath, const char *newpath);


ファイルのハード接続を作成します.ファイルのハード接続を作成rm削除ファイルがフォルダの下のレコード項目inodeを削除するハード接続である場合1を減らします.Inodeのハード接続技術がゼロに減少するとblockブロックはゼロに反転します
rename
  #include 

       int rename(const char *oldpath, const char *newpath);


名前を変更するという意味です.
chdir
SIS
       #include 

       int chdir(const char *path);
       int fchdir(int fd);


現在のプロセスの作業ディレクトリを変更
getcwd
IS
       #include 

       char *getcwd(char *buf, size_t size);

       char *getwd(char *buf);

       char *get_current_dir_name(void);


現在の作業ディレクトリの取得
ディレクトリに入るのは、このappのプロセスがディレクトリに入るだけです.このappプロセスは受け入れられた後、shellのプロセスが存在するディレクトリファイルに戻ります.
mkdirという関数はディレクトリを生成することです
opendir
ディレクトリ名を開く
  #include 
       #include 

       DIR *opendir(const char *name);
       DIR *fdopendir(int fd);


DIR*このタイプのポインタは、ディレクトリがディレクトリを指す最初のエントリを指します.
これは、次のディレクトリの読み取りを開始するコンテンツを開きます.
readdir
#include 

       struct dirent *readdir(DIR *dirp);

       int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);


ディレクトリポインタからディレクトリ内のエントリを読み取るポインタはレコードエントリポインタですこのポインタはどんなものですか
 struct dirent {
               ino_t          d_ino;       /* inode number    inode */
               off_t          d_off;       /* offset to the next dirent              */
               unsigned short d_reclen;    /* length of this record        */
               unsigned char  d_type;      /* type of file; not supported
                                              by all file system types 。      */
               char           d_name[256]; /* filename     */
           };


私たちは主にファイルのinode号のファイル名が何なのか、またファイルのタイプが何なのかに注目しています.この関数を利用して読み込むと、DIR*ポインタが自動的に次のファイルの末尾に記録され、NULLアドレスinodeが設定されるかどうかを後悔します.
rewinddir
  #include 

       #include 

       void rewinddir(DIR *dirp);


この関数はDIR*ポインタがディレクトリの先頭に戻ります
telldir
 #include 

       long telldir(DIR *dirp);

このディレクトリポインタが指す位置を返します
seekdir
#include 

       void seekdir(DIR *dirp, long offset);

ディレクトリポインタをその位置に設定する
closedir
 #include 

       #include 

       int closedir(DIR *dirp);


このディレクトリを閉じる
ケース再帰スキャンディレクトリ
仮想ファイルシステム
仮想ファイルシステムはlinuxシステムに様々なファイルシステムを読み取る抽象層である.各ファイルシステムに抽象層を再カプセル化することです
dup
       int dup(int oldfd);
       int dup2(int oldfd, int newfd);

       #define _GNU_SOURCE
       #include 

       int dup3(int oldfd, int newfd, int flags);



この関数は、2つのファイル記述子が同じfile構造体だけを望んでいるように、1つのファイル記述子をコピーします.file構造体を指す
file構造体の参照数は2です.file構造体の参照カウントは2になります.file構造体参照i火速が2 close関数になるのは、file構造体の参照カウントを1減らしてファイルを開くだけです.ファイル構造体を生成します.ファイル構造体を解放しないと、メモリが漏れてしまいます.