選擇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論成敗 以架構論英雄 閱讀(1506) 評論(2)  編輯  收藏 所屬分類: Reading

          評論

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

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

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

          順便問一下
          實現ls -l /dev
          怎么做呢?
          2006-11-04 16:07 | 1jjk
          主站蜘蛛池模板: 科技| 原阳县| 那坡县| 大渡口区| 西峡县| 隆尧县| 阿拉善左旗| 金山区| 溧阳市| 二手房| 禄丰县| 阳新县| 滦平县| 临泽县| 玉山县| 偏关县| 广宁县| 乐亭县| 天柱县| 安达市| 灵川县| 高雄县| 铜鼓县| 清镇市| 军事| 宿州市| 万载县| 龙山县| 织金县| 门源| 永和县| 高碑店市| 宁城县| 舟山市| 九江县| 翁牛特旗| 花莲县| 开平市| 邛崃市| 平陆县| 隆林|