1. 程式人生 > >linux程式設計實踐4(實現ls -l命令)

linux程式設計實踐4(實現ls -l命令)

下面是ls -l的簡單實現,還有很多不完善的地方,如沒有進行排序等。

#include<stdio.h>
#include<dirent.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include<string.h>

void do_ls(char *);
void do_stat(char *);
void show_file_info(char *, struct stat *);
void transfer_mode(mode_t, char mode_str[]);
char * uid_to_name(uid_t uid);
char * gid_to_name(gid_t gid);

int main(int argc, char **argv)
{
    if(argc == 1)
        do_ls(".");
    else
        while(--argc)
        {
            printf("%s:\n", *++argv);
            do_ls(*argv);
        }

    return 0;
}

void do_ls(char *path)
{
    char * filename;
    DIR * dir_ptr;
    struct dirent * dirent_ptr;

    if((dir_ptr = opendir(path)) == NULL)
    {
        perror("opnedir");
        exit(1);
    }

    while((dirent_ptr = readdir(dir_ptr)) != NULL)
    {
        do_stat(dirent_ptr->d_name);
    }
    closedir(dir_ptr);

}

void do_stat(char *filename)
{
    struct stat info;
    if(stat(filename, &info) == -1)
        perror("stat");
    else
        show_file_info(filename, &info);
}

void show_file_info(char *filename, struct stat *info)
{
    char mode_str[11];
    transfer_mode(info->st_mode, mode_str);
    printf("%s", mode_str);

    printf("%4d", (int)info->st_nlink);
    printf("%8s", uid_to_name(info->st_uid));
    printf("%8s", gid_to_name(info->st_gid));
    printf("%8ld", info->st_size);
    printf("%15.12s", ctime(&info->st_mtime) + 4);
    printf("%15s\n", filename);

}

char * uid_to_name(uid_t uid)
{
    struct passwd *pwd;
    static char user_id[10];

    if((pwd = getpwuid(uid)) == NULL)
    {
        sprintf(user_id, "%d", uid);
        return user_id;
    }
    else
        return pwd->pw_name;
}

char * gid_to_name(gid_t gid)
{
    struct group *group;
    static char group_id[10];

    if((group = getgrgid(gid)) == NULL)
    {
        sprintf(group_id, "%d", gid);
        return group_id;
    }
    else
        return group->gr_name;
}

void transfer_mode(mode_t mode, char mode_str[])
{
    strcpy(mode_str, "----------");

    if(S_ISDIR(mode))   mode_str[0] = 'd';
    if(S_ISCHR(mode))   mode_str[0] = 'c';
    if(S_ISBLK(mode))   mode_str[0] = 'b';
    if(S_ISLNK(mode))   mode_str[0] = 'l';
    if(S_ISFIFO(mode))   mode_str[0] = 'p';
    if(S_ISSOCK(mode))   mode_str[0] = 's';

    if(mode & S_IRUSR)  mode_str[1] = 'r';
    if(mode & S_IWUSR)  mode_str[2] = 'w';
    if(mode & S_IXUSR)  mode_str[3] = 'x';

    if(mode & S_IRGRP)  mode_str[4] = 'r';
    if(mode & S_IWGRP)  mode_str[5] = 'w';
    if(mode & S_IXGRP)  mode_str[6] = 'x';

    if(mode & S_IROTH)  mode_str[7] = 'r';
    if(mode & S_IWOTH)  mode_str[8] = 'w';
    if(mode & S_IXOTH)  mode_str[9] = 'x';
}


相關推薦

linux程式設計實踐4實現ls -l命令

下面是ls -l的簡單實現,還有很多不完善的地方,如沒有進行排序等。 #include<stdio.h> #include<dirent.h> #include<sys/types.h> #include<sys/stat.h&

Unix/Linux程式設計實踐教程

-------------------------------前言呃。。。。開始入坑linux。參考書當然是《Unix/Linux程式設計實踐教程》現寫下心得筆記,有什麼不對的,請大家指正哈。------------------------------修正2018.5.13貌

【Unix/Linux程式設計實踐】 動手實現簡單的more

最近都在看一些理論方面的書,缺乏實踐真的是雲裡霧裡的,於是今天開始看《Unix/Linux程式設計實踐教程》,理論實踐相結合! 自己動手來實現linux的一些功能,確實挺有趣的,而且還能加深對系統的理解~ 版本一 /*more01.c *read a

笨方法利用stat函數實現ls -l filename

一個 case break 基本上 說明 方式 恢復 bcd 只讀 學習了一段時間的Linux了,但是我感覺我做不出來啥子,後頭選擇利用系統IO函數實現命令,先從ls走起吧。先來看看ls -l filename給我們顯示了什麽吧 : 可以看到,一共八項:文件類型、用戶權限、

unix/linux程式設計實踐教程C語言補充2

1 getchar()和putchar()函式 getchar()函式的功能是從終端接受一個字元。可以將其置於程式中實現暫停功能。 getchar()函式接受的字元可以賦給一個字元型或整型變數,也可以賦給任何變數,直接輸出。 putchar(引數)  引數可以是一個字元

Linux入門實踐筆記——Win下Git配置SSH連線GitHub實現無密提交

#執行ssh-keygen指令生成SSH, #其中-t選項用於指定金鑰生成的演算法,此處使用RSA; #-C選項是公鑰檔案中的備註,此處使用使用者郵箱作為備註。 [email protected] MINGW64 ~/.ssh $ ssh-keygen -t rsa -C "[email 

Linux C語言實現ls -l

Linux下C語言實現ls -l功能 宗旨:技術的學習是有限的,分享的精神是無限的。 需求:用ls -l顯示資料夾下所有的檔案及屬性 分析:1 用ls顯示資料夾下的所有檔案,首先用opendir開啟資料夾,再用readdir讀取資料夾裡面的檔案,最後closedir關閉

Unix/Linux程式設計實踐教程–ac在Ubuntu 14.04的實現

環境:Ubuntu 14.04 32位 為什麼這回不寫在OS x上的實現了?因為OS X使用的是utmpx,然後我用getutxent_wtmp()這個函式也沒有辦法正確獲取wtmp的日誌資訊,所以先在Ubuntu上實現好了。 預設沒有帶ac這個程式,需要自

Unix/Linux程式設計實踐教程–od在OS X的實現

環境:OS X 10.12.4 抱歉,本文章並不是關於Ollydbg的實現(笑)。 照舊man 1 od。 od 是一個能把指定的檔案或者標準輸入按照使用者定義的格式列印。( The od utility is a filter which displa

Linux ls -l命令實現

使用方法:ls  [目錄名]    輸出結果:此目錄下的檔案和子目錄的詳細資訊 ls -l工作原理: ------開啟目錄檔案//opendir(dirname)系統呼叫 -----while(not end of 目錄檔案) -----{  -----   讀取一個目錄項

Unix/Linux程式設計實踐教程–chmod在Centos7.3的實現

環境:centos 7.3 x86_64 如果搜一下man就會發現,裡面有兩個chmod,一個是chmod(1),一個是chmod(2)。根據牛頓-萊布尼茲公式,立即推,第一個是使用者命令,第二個是系統呼叫。系統呼叫裡,函式的原型是這樣的: int chmo

學習《Unix/Linux程式設計實踐教程》(2):實現 more

0.目錄 1.more 能做什麼? 2.more 是如何實現的? 3.實現 more 3.1 more01.c 3.2 more02.c 3.3 more03.c 1.more 能做什麼? more 可以分頁顯示檔案的內容。正常執行後 more 會顯示檔案第一屏的內容,在螢幕的底

Unix/Linux程式設計實踐教程–cat在OS X的實現

環境:OS X 10.12.4 cat 這玩意兒在哪個Unix平臺實現都一樣吧- - cat這個程式是把引數中的檔名的檔案內容輸出到標準輸出,如果引數中沒有檔名,預設是把標準輸入的內容輸出到標準輸出。 這裡使用了utmplib類似的程式碼用於快取資料,減少

java併發程式設計實踐學習4構建塊

一.同步容器 同步容器包括倆部分Vector和HashTable,這些類由Collection.synchronizedxxx工廠方法建立,這些類通過封裝他們的狀態,並對每一個公共方法進行同步而實現了執行緒的安全,這樣一次只能有一個執行緒訪問容器的狀態。

linuxls -l命令即ll命令檢視檔案的顯示結果分析

在linux下使用“ls -l”或者“ls -al”或者“ll”命令檢視檔案及目錄詳情時,shell中會顯示出好幾列的資訊。平時也沒怎麼注意過,今天忽然心血來潮想了解一下,於是整理了這篇部落格,以供參考: 首先給出一張典型的顯示結果: 下面對其中的每一列

《Unix-Linux程式設計實踐教程》讀書筆記

寫在最前:          第一遍:零零散散的花了近兩個月的時間讀了本書的第一遍,這是一本很適合剛剛掌握一些計算機基礎知識的人讀的書。學習的思路非常明確,能做什麼?怎麼做?自己動手?三個方面符合認知順序,由淺入深讓人易於接受;而且每章的內容相對獨立和簡單,適合初次接觸類

實現ls-l功能

1、“ls -l”的意義   以長格式顯示目錄下的內容列表。輸出的資訊從左到右依次包括檔名,檔案型別、許可權模式、硬連線數、所有者、組、檔案大小和檔案的最後修改時間等。   例:-rw-rw-r-- 1 using using 3102 7月 22 17:06 test.c     drwxrwxr-x

Unix-Linux 程式設計實踐教程 第十章 小結

檔案描述符是一個資源陣列的索引,每次取最小的用,0、1、2分別代表stdin,stdout,stderr三個標準IO的描述符。重定向只需close其中其中一個,然後再開啟一個檔案描述符,系統自動將關閉掉的索引重新使用。比如close(0),open(x-file,"r"),此時就是將stdi

Unix-Linux 程式設計實踐教程 第八章 小結

執行程式的函式---execvp()                     &n

Unix-Linux 程式設計實踐教程 第七章 小結

設定傳送訊號的計時器---alarm()alarm()設定當前程序的計時器到seconds秒後收到由核心發來的SIGALARM訊號 pause()掛起呼叫程序知道一個訊號到達,如果呼叫程序被整個訊號終止,pause()則不會返回。 三種計時器: ITIMER_