<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
    主站蜘蛛池模板: 亚洲一级毛片视频| 久久久久亚洲精品日久生情| 亚洲人成网站色7799| 无码永久免费AV网站| 亚洲永久中文字幕在线| 91香蕉成人免费网站| 国产亚洲精品bv在线观看| 夫妻免费无码V看片| 粉色视频成年免费人15次| 亚洲第一区精品日韩在线播放| 日韩大片在线永久免费观看网站 | 国产免费看JIZZ视频| 亚洲人成在线播放| 青青草国产免费久久久下载| 亚洲精品成a人在线观看☆| 亚洲AV无码之日韩精品| 成人国产精品免费视频| 精品日韩亚洲AV无码| 69xx免费观看视频| 激情婷婷成人亚洲综合| 亚洲区小说区图片区| 免费A级毛片无码A∨中文字幕下载| 亚洲无限乱码一二三四区| 日本免费无遮挡吸乳视频电影| 国产成人亚洲精品无码AV大片| 亚洲精品视频免费观看| 国产午夜免费高清久久影院| 亚洲日本国产精华液| avtt亚洲天堂| 精品无码人妻一区二区免费蜜桃| 亚洲中文字幕久久久一区| 亚洲中文字幕无码爆乳av中文| 91大神免费观看| 国产亚洲美女精品久久| 亚洲综合精品一二三区在线 | 一级有奶水毛片免费看| 亚洲精品成人久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 曰皮全部过程视频免费国产30分钟 | 男人的好免费观看在线视频| av网站免费线看|