在學習linux系統程式設計的時候,實現了ls命令的簡化版本。
實現的功能如下:
1. 每種檔案型別有自己的顏色 (- 普通檔案, d 目錄檔案, l 鏈結檔案, c 字元裝置檔案, b 快裝置檔案, p 管道檔案, s socket檔案。共7種)
2. 支援的引數有 -hali (a: 顯示隱藏檔案, i: 顯示inode節點號,l: 以列表形式顯示檔案的詳細資訊,h: 人類可讀的檔案大小顯示)
3. 對於符號鏈結,顯示出其指向的檔案。
4. 裝置檔案,顯示主裝置號和次裝置號,不顯示檔案大小(裝置檔案沒有大小屬性,對於裝置號,不同的 *nix 儲存方式可能不同)
5. 檔案按照字典序排序顯示。
程式說明:
1. 程式中大部分使用的都是linux系統呼叫和c標準庫函式,只有檔案排序用到了c++ stl 的vector和sort演算法(好吧,我又偷懶了!)
2. lstat(): 獲取檔案的詳細資訊,inode, 許可權, 連線數, uid, gid, size, time 等(對於符號鏈結檔案,返回自身的資訊,而不是目標檔案的)
opendir(), readdir(), closedir(): 讀取目錄資訊。
getpwuid(), getgrgid(): 通過uid, gid 獲取使用者和組的詳細資訊。
3. 對於不同檔案型別的顏色,在linux下可以使用env命令獲取,也可以在程式中使用 extern char **environ 或 getenv() 獲取。
#include #include #include #include #include #include #include #include #include #include #include // c++
#include #include #include using namespace std;
#define buf_size 1024
#define color_r (char*)"\33[0m"
#define color_d (char*)"\33[01m\33[34m"
#define color_l (char*)"\33[01m\33[36m"
#define color_p (char*)"\33[40m\33[33m"
#define color_b (char*)"\33[40m\33[33m"
#define color_c (char*)"\33[40m\33[33m"
#define color_s (char*)"\33[02m\33[35m"
#define reset_clolr (char*)"\33[0m"
int get_option(const char *opt);
int show_ls();
int show_ls_one_path(const char *path);
int show_ls_file(const char *path, const char *name);
int show_ll_part(struct stat *p_stat, int bhuman);
void to_humen_size(char *buf, off_t size);
char get_file_type(mode_t st_mode);
void get_mode(char *buf, mode_t st_mode);
// global var
enum eopt
;int g_opt[e_num] = ; // order: -ailh
char *g_scolor;
vectorgv_path;
/* ls: ./a.out argv... */
int main(int argc, char const *argv)
} else
}if (0 == gv_path.size())
show_ls();
return 0;
}/* -ailh */
int get_option(const char *opt)
opt++;
} return 0;
}int show_ls()
return 0;
}int show_ls_one_path(const char *path)
else
;strncpy(sdir, path, p-path);
show_ls_file(sdir, p+1);
}printf("\n");
return 0;
} perror(path);
return -1;
} if (gv_path.size() > 1)
struct dirent *entry;
vectorv_name;
while (1)
// show conten depends on option(g_opt)
if (g_opt[e_a] != 1)
}v_name.push_back(entry->d_name);
} // sort filename
sort(v_name.begin(), v_name.end());
for (vector::iterator it = v_name.begin();
it != v_name.end(); ++it)
fprintf(stdout, "\n");
closedir(dir);
}int show_ls_file(const char *path, const char *name)
if (1 == g_opt[e_i])
if (1 == g_opt[e_l])
else
// show filename with color
fprintf(stdout, "%s", g_scolor);
fprintf(stdout, "%s ", name);
fprintf(stdout, reset_clolr);
if (1 == g_opt[e_l] && 'l' == get_file_type(st_stat.st_mode))
if (1 == g_opt[e_l])
return 0;
}/* show ll: mode, link num, user, group, size, time */
int show_ll_part(struct stat *p_stat, int bhuman)
else // show file size
else
}// time
char stime[buf_size] = ;
snprintf(stime, 13, "%s", 4+ctime(&p_stat->st_ctime));
fprintf(stdout, " %s ", stime);
return 0;
}// -h option
void to_humen_size(char *buf, off_t size)
else if (size >= 1024*1024)
else if (size >= 1024)
else }
char get_file_type(mode_t st_mode)
if (s_isdir(st_mode))
if (s_ischr(st_mode))
if (s_isblk(st_mode))
if (s_isfifo(st_mode))
if (s_islnk(st_mode))
if (s_issock(st_mode))
g_scolor = color_r;
return '-';
}// -rwx---...
void get_mode(char *buf, mode_t st_mode)
buf[10] = '\0';
}
**:
Redis命令簡化版總結
string型別的操作 1.單個設定 set key value 2.單個獲取 get key 3.刪除 del key 4.多個設定 mset key1 value1 key2 value2 5.多個獲取 mget key1 key2 6.獲取長度 strlen key 7.設定有效期 setex...
報表製作簡化版
機房收費系統無論是重構還是第一版,都用到了報表,為什麼在乙個系統中要新增報表呢?報表的作用是什麼呢?報表百科。我理解的報表是 向上級報告情況的乙個媒介,沒有固定的格式。之前在專案中,我們真正給企業做過一次報表,是以匯出word的形式生成的,大概格式如圖 這次在自己的 機房收費系統 中設計報表,我使用...
飛機大戰 簡化版
import pygame from pygame.locals import import random import time class herobullet def init self,x,y,windows self.x x self.y y self.windows windows se...