Linux ls 命令實現(簡化版)

2021-06-26 13:24:51 字數 4015 閱讀 3212

在學習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...