<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    選擇java 進入自由開放的國度

    隨筆 - 49, 文章 - 3, 評論 - 154, 引用 - 1
    數據加載中……

    linux中命令ls的實現

    基本實現了明令ls -l的功能,能顯示列表,但還有如下缺陷:結果沒有排序,不能顯示總大小,不能顯示其他目錄下的文件列表。

    程序中使用了掩碼的技術來實現數值到文件類型、文件權限列表字符串的轉換,使用命令getpwuid(uid_t uid)將用戶id轉換為名子,使用getgrgid(gid_t gid)將組id轉換為組名。

    下面是代碼:
    ??1?#include?<stdio.h>
    ??2?#include?<sys/types.h>
    ??3?#include?<sys/stat.h>
    ??4?#include?<dirent.h>
    ??5?#include?<string.h>
    ??6?
    ??7?void?do_ls(char[]);
    ??8?void?dostat(char?*);
    ??9?void?show_file_info(char?*filename,?struct?stat?*buf);
    ?10?void?mode_to_letters(int,?char[]);
    ?11?char?*uid_to_name(uid_t);
    ?12?char?*gid_to_name(gid_t);
    ?13?
    ?14?main(int?ac,?char?*av[])
    ?15?{
    ?16???if?(ac?==?1)
    ?17???????do_ls(".");
    ?18???else
    ?19???????while(--ac)
    ?20???????{
    ?21?????????printf("%s:?\n",?*++av);
    ?22?????????do_ls(*av);
    ?23???????}
    ?24?}
    ?25?
    ?26?void?do_ls(char?dirname[])
    ?27?{
    ?28???/*
    ?29????*?list?files?in?directory?called?dirname
    ?30????*/
    ?31????
    ?32???DIR?*dir_ptr;?????????????//the?directory
    ?33???struct?dirent?*direntp;???//each?entry
    ?34???
    ?35???if(?(dir_ptr?=?opendir(dirname))?==?NULL)
    ?36??????fprintf(stderr,?"ls1:cannot?open?%s\n",?dirname);
    ?37???else
    ?38???{
    ?39?????while?(?(direntp?=?readdir(dir_ptr))?!=?NULL)
    ?40?????????dostat(direntp->d_name);
    ?41?????
    ?42?????closedir(dir_ptr);
    ?43???}
    ?44???
    ?45?}
    ?46?
    ?47?
    ?48?void?dostat(char?*filename)
    ?49?{
    ?50???struct?stat?info;
    ?51???if?(stat(filename,?&info)?==?-1)
    ?52??????perror(filename);
    ?53???else
    ?54??????show_file_info(filename,?&info);
    ?55?}
    ?56?
    ?57?void?show_file_info(char?*filename,?struct?stat?*buf)
    ?58?{
    ?59???/*
    ?60????*?display?some?info?stat?in?a?name?=?value?formant
    ?61????*/
    ?62????char?*uid_to_name(uid_t);
    ?63????char?*?ctime(time_t?*);
    ?64????char?*?gid_to_name(gid_t),?filemode();
    ?65????//void?mode_to_letters();
    ?66????char?modestr[11];
    ?67????
    ?68????mode_to_letters(buf->st_mode,?modestr);
    ?69????
    ?70????printf("%s",?modestr);
    ?71????printf("%4d",??buf->st_nlink);
    ?72????printf("%-8s",???uid_to_name(buf->st_uid));
    ?73????printf("%-8s",??gid_to_name(buf->st_gid));
    ?74????printf("%8ld",???(long)buf->st_size);
    ?75????//printf("modtime:%d\n",buf->st_mtime);
    ?76????printf("%.12s",4+ctime(&buf->st_mtime));
    ?77????printf("%s\n",?filename);??
    ?78????
    ?79?}
    ?80?
    ?81?/*
    ?82??*?utility?functions
    ?83??*/
    ?84?
    ?85?void?mode_to_letters(int?mode,?char?str[])
    ?86?{
    ?87???strcpy(str,?"----------");
    ?88???
    ?89???if(S_ISDIR(mode))?str[0]?=?'d';
    ?90???if(S_ISCHR(mode))?str[0]?=?'c';
    ?91???if(S_ISBLK(mode))?str[0]?=?'b';
    ?92???
    ?93???if(mode?&?S_IRUSR)?str[1]?=?'r';
    ?94???if(mode?&?S_IWUSR)?str[2]?=?'w';
    ?95???if(mode?&?S_IXUSR)?str[3]?=?'x';
    ?96???
    ?97???if(mode?&?S_IRGRP)?str[4]?=?'r';
    ?98???if(mode?&?S_IWGRP)?str[5]?=?'w';
    ?99???if(mode?&?S_IXGRP)?str[6]?=?'x';
    100???
    101???if(mode?&?S_IROTH)?str[7]?=?'r';
    102???if(mode?&?S_IWOTH)?str[8]?=?'w';
    103???if(mode?&?S_IXOTH)?str[9]?=?'x';??
    104?}
    105?
    106?#include?<pwd.h>
    107?
    108?char?*uid_to_name(uid_t?uid)
    109?/*
    110??*?returns?pointer?to?username?associated?with?uid,?uses?getpw()
    111??*/
    112?{
    113???struct?passwd??*pw_ptr;
    114???static?char?numstr[10];
    115???
    116???if(?(pw_ptr?=?getpwuid(uid))?==?NULL)
    117???{
    118?????printf(numstr,?"%d",?uid);
    119?????return?numstr;
    120???}
    121???else
    122?????return?pw_ptr->pw_name;
    123?}
    124?
    125?#include?<grp.h>
    126?
    127?char?*gid_to_name(gid_t?gid)
    128?{
    129???struct?group?*grp_ptr;
    130???static?char?numstr[10];
    131???
    132???if?((grp_ptr?=?getgrgid(gid))?==?NULL)
    133???{
    134?????sprintf(numstr,?"%d",?gid);
    135?????return?numstr;
    136???}
    137???else
    138?????return?grp_ptr->gr_name;
    139?}
    140???
    141?

    爭取早日將其他功能實現。

    posted on 2006-03-27 08:47 soochow_hhb 以java論成敗 以架構論英雄 閱讀(1504) 評論(2)  編輯  收藏 所屬分類: Reading

    評論

    # re: linux中命令ls的實現  回復  更多評論   

    閣下的代碼很眼熟啊
    2006-11-04 16:06 | 1jjk

    # re: linux中命令ls的實現  回復  更多評論   

    順便問一下
    實現ls -l /dev
    怎么做呢?
    2006-11-04 16:07 | 1jjk
    主站蜘蛛池模板: 亚洲av第一网站久章草| 久久永久免费人妻精品下载 | 久久99国产亚洲高清观看首页| 亚洲AV无码乱码国产麻豆| 亚洲综合av一区二区三区| 九九热久久免费视频| 国产精品成人免费视频网站京东| 国产精品V亚洲精品V日韩精品 | 亚洲成人黄色在线观看| 日韩免费在线中文字幕| 欧洲乱码伦视频免费| 亚洲国产a∨无码中文777| 日韩视频在线观看免费| 浮力影院亚洲国产第一页| 亚洲日本成本人观看| 57pao国产成永久免费视频| 亚洲免费一区二区| 亚洲精品无码你懂的| 日本免费福利视频| 亚洲精品二三区伊人久久| 99国产精品视频免费观看| 亚洲精品成人网站在线播放| 野花香高清视频在线观看免费 | 在线观看免费宅男视频| 亚洲欧洲久久精品| 色播在线永久免费视频| 亚洲精品伊人久久久久| 亚洲av无码天堂一区二区三区 | 特级aaaaaaaaa毛片免费视频| 无码日韩精品一区二区免费| 久久精品九九亚洲精品| 人妻免费一区二区三区最新| 亚洲人成无码网WWW| 精品一区二区三区免费| 欧洲 亚洲 国产图片综合| 1024免费福利永久观看网站| 久久综合亚洲色HEZYO社区 | 亚洲最大的黄色网| 成年女人午夜毛片免费视频| 国产精品免费视频一区| 亚洲kkk4444在线观看|