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工廠方法建立,這些類通過封裝他們的狀態,並對每一個公共方法進行同步而實現了執行緒的安全,這樣一次只能有一個執行緒訪問容器的狀態。
linux下ls -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_