いっしょにtalk C栗(第七十七回:C言語例--DIY ls命令続)
10972 ワード
皆さん、こんにちは、前回は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のコードです.参考にしてください.
上記のコードについて説明します.statは構造体タイプで、このタイプのメンバーにはファイルの詳細が含まれています.例えば、コードで使用しているuidなどです.これらのプロパティを活用して、ファイルの詳細を得ることができます.
例えば、S_ISDIRなどのマクロとst_の結合modeプロパティは、ファイルのタイプがディレクトリまたは他のタイプ(通常ファイル、リンク、パイプなど)であるかどうかを判断します.S_も使えますIRUSRなどのマクロとst_を結合modeは、ファイルの3つの権限値(rwxrw-r-)のセットを判断します.
官達を見て、本文の中でコードを書かないで、詳しいコードは私の資源の中に置いて、みんなはここをクリックしてダウンロードして使うことができます.また、この関数は前の章のmainと一致する必要がある.cとmain.hを併用する.
以下はプログラムの実行結果です.ご参考にして、システム内のls-lコマンドの実行結果と比較してください.
皆さん、DIY ls命令の例についてお話しします.後に何か例があるか知りたいので、次の分解を聞いてください.
私达は前の章の回の中でDIYはls命令を过ぎて、时间は长くなくて、みんながまだ印象があることを信じます.今日は前の章回の補足で、主にlsコマンドを拡張して、元の基礎の上でまたlパラメータをサポートすることができます.
新たにlパラメータのサポートを追加しました.以下は具体的な操作手順です.参考にしてください.
次は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命令の例についてお話しします.後に何か例があるか知りたいので、次の分解を聞いてください.