いっしょにtalk C栗(第七十七回:C言語例--DIY ls命令続)


皆さん、こんにちは、前回はDIY cat命令の例を言いましたが、今回はDIY ls命令の続きを言いました.余談はさておき,話は本筋に戻る.一緒にtalk C栗を食べましょう!
私达は前の章の回の中でDIYはls命令を过ぎて、时间は长くなくて、みんながまだ印象があることを信じます.今日は前の章回の補足で、主にlsコマンドを拡張して、元の基礎の上でまたlパラメータをサポートすることができます.
新たにlパラメータのサポートを追加しました.以下は具体的な操作手順です.参考にしてください.
  • 1.stat関数を使用してファイルからファイルのプロパティを取得します.
  • 2.属性のst_に基づいてmode値は、ディレクトリ、リンク、パイプなど、ファイルのタイプを判断します.
  • 3.属性のst_からmode値からファイルの権限(rwx)が抽出され、抽出方法はビット操作の使用と操作である.
  • 4.getpwuid関数を使用して、属性のst_に基づいてuid値は、ファイルのユーザー名(user name)を取得します.
  • 5.getgrgid関数を使用して、属性のst_に基づいてgid値は、ファイルのグループ名(group name)を取得します.
  • 6.ctime関数を使用して、属性のst_に基づいてmtime値は、ファイルの変更日時を計算します.
  • 7.ls-lのフォーマットに従って、表示フォーマットを調整し、ステップ2から6の値を画面に出力します.

  • 次はDIYのコードです.参考にしてください.
    void show_attr(char *name)
    {
        struct stat buf;
        struct passwd *pwd;
        struct group *grp;
        char type ;
        char permission[9];
        int i = 0 ;
    
        memset(permission,'-',9*sizeof(char));
    
        if(!stat(name,&buf))
        {
            // get the type of file
            if(S_ISLNK(buf.st_mode))
                type = 'l';
            else if(S_ISREG(buf.st_mode))
                type = '-';
            else if(S_ISDIR(buf.st_mode))
                type = 'd';
            else if(S_ISCHR(buf.st_mode))
                type = 'c';
            else if(S_ISBLK(buf.st_mode))
                type = 'b';
            else if(S_ISFIFO(buf.st_mode))
                type = 'p';
            else if(S_ISSOCK(buf.st_mode))
                type = 's';
    
            // get the permission of file
            if(buf.st_mode & S_IRUSR)
                permission[0] = 'r';
            if(buf.st_mode & S_IWUSR)
                permission[1] = 'w';
            if(buf.st_mode & S_IXUSR)
                permission[2] = 'x';
            if(buf.st_mode & S_IRGRP)
                permission[3] = 'r';
            if(buf.st_mode & S_IWGRP)
                permission[4] = 'w';
            if(buf.st_mode & S_IXGRP)
                permission[5] = 'x';
            if(buf.st_mode & S_IROTH)
                permission[6] = 'r';
            if(buf.st_mode & S_IWOTH)
                permission[7] = 'w';
            if(buf.st_mode & S_IXOTH)
                permission[8] = 'x';
    
            // get the user name and group name
            pwd = getpwuid(buf.st_uid);
            grp = getgrgid(buf.st_gid);
    
            if(NULL == pwd)
            {
                printf("pw is null 
    "
    ); exit(1); } if(NULL == grp) { printf("grp is null
    "
    ); exit(1); } // show file type printf("%c",type); // show permission of usr, grout and other while(i<9) { printf("%c",permission[i]); i++; } // show the count of link printf("%2d ",buf.st_nlink); // show the user name and group name printf("%-4s",pwd->pw_name); printf("%-4s",grp->gr_name); // show the size of file printf( "%6ld ",buf.st_size); // show the time of file printf("%.12s",ctime(&buf.st_mtime)+4);//+ 4 skip the weekday,12s don't show year info // show the name of file printf(" %s
    "
    ,name); } else { printf("can't get the state of %s
    "
    ,name); exit(1); } }

    上記のコードについて説明します.statは構造体タイプで、このタイプのメンバーにはファイルの詳細が含まれています.例えば、コードで使用しているuidなどです.これらのプロパティを活用して、ファイルの詳細を得ることができます.
    例えば、S_ISDIRなどのマクロとst_の結合modeプロパティは、ファイルのタイプがディレクトリまたは他のタイプ(通常ファイル、リンク、パイプなど)であるかどうかを判断します.S_も使えますIRUSRなどのマクロとst_を結合modeは、ファイルの3つの権限値(rwxrw-r-)のセットを判断します.
    官達を見て、本文の中でコードを書かないで、詳しいコードは私の資源の中に置いて、みんなはここをクリックしてダウンロードして使うことができます.また、この関数は前の章のmainと一致する必要がある.cとmain.hを併用する.
    以下はプログラムの実行結果です.ご参考にして、システム内のls-lコマンドの実行結果と比較してください.
    |->ls -l                   // shell      ls -l  
    -rw-r--r-- 1 talk8 talk8    774 Dec 16 22:24 cat.c
    -rw-r--r-- 1 talk8 talk8    596 Dec 13 09:59 cd.c
    -rw-r--r-- 1 talk8 talk8    955 Dec 10 20:59 date.c
    -rw-r--r-- 1 talk8 talk8   4326 Dec 17 23:05 ls.c
    -rw-r--r-- 1 talk8 talk8   1139 Dec 17 23:03 main.c
    -rw-r--r-- 1 talk8 talk8    611 Dec 17 23:02 main.h
    -rw-r--r-- 1 talk8 talk8    256 Dec 10 20:59 pwd.c
    -rwxr-xr-x 1 talk8 talk8  12916 Dec 17 23:05 s
    |->exit                    //  DIY shell

    皆さん、DIY ls命令の例についてお話しします.後に何か例があるか知りたいので、次の分解を聞いてください.