日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

ubantu实现linux命令的实验_C语言实现linux命令---ls

發(fā)布時間:2023/12/31 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ubantu实现linux命令的实验_C语言实现linux命令---ls 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ls

輸出一個文件名的列表,它是這樣工作的

open directory; while(!(end of dir)) {read file info; } open directory

看一下結果:

難點還是main函數(shù)的參數(shù)變化,就是我們只輸入./myls1 著就相當于main獲得一個參數(shù),也就是argc=1,*argv=“./myls1 ”

當你輸入

./myls1 ../ls ../camke-build-debug

此時:

argc=3; *argv=“./myls1 ”; *(argv+1) = “ ../ls ”; *(argv+2) = “ ../camke-build-debug”;

再說一下readdir函數(shù)的特點,接受一個Dir *參數(shù),返回一個dirent *

有個循環(huán):

while((pdirent=readdir(pDir)) != NULL) {if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0){continue;}printf("%sn", pdirent->d_name);}

一般我們比如寫while(i>0),循環(huán)體里面肯定會有i--之類的

容易發(fā)現(xiàn)循環(huán)條件是(pdirent=readdir(pDir)) != NULL,在循環(huán)體內(nèi)找不到關于dirent的代碼,其實readdir(pDir)的返回值每次都不一樣,它會返回目錄下的所有文件結構體直到返回NULL

opendir(const char *pathname)函數(shù) 接受一個路徑,打開這個路徑下的目錄,成功則返回DIR*型態(tài)的目錄,失敗則返回NULL


opendir只能打開目錄路徑,如果時./mian.c這種單個文件是打不開的(這是不是表明Dir只能表示目錄)

綜上,我們想獲取一個目錄下所有文件名(包括目錄,目錄也是文件)需要以下幾步:

  • 調(diào)用opendir函數(shù)并傳入目錄所在路徑char *類型(此時應該判斷是不是打開成功)
  • 循環(huán)調(diào)用readdir函數(shù)并傳入opendir返回的Dir *指針,用dirent *指針接收其返回值,直到readdir返回NULL
  • 通過dirent *指針的d_name屬性獲取文件名或者其他信息
  • 最后關閉closedir(pDir);

源碼:

#include<stdio.h> #include<string.h> #include<dirent.h>void ls(char *dirpath);int main(int argc, char *argv[]) {if(argc==1)//沒有命令行參數(shù)時,列出當前目錄中的文件和目錄列表{ls(".");}else{while(--argc){printf("%s:n",*++argv);ls(*argv);}}return 0; }void ls(char *dirpath) {DIR *pDir;struct dirent *pdirent;if((pDir=opendir(dirpath)) == NULL){fprintf(stderr,"ls1:cannot open %sn",dirpath);}else{while((pdirent=readdir(pDir)) != NULL){if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0){continue;}printf("%sn", pdirent->d_name);}closedir(pDir);} }

函數(shù)stat的作用是獲取文件路徑為file_path的文件的詳細信息,存儲在stat結構體中,file_path既可以是文件路徑也可以是目錄路徑

int stat(const char *file_path, struct stat *buf); 執(zhí)行成功則返回0,失敗返回-1,錯誤代碼存于errno 錯誤代碼: ENOENT 參數(shù)file_name指定的文件不存在 ENOTDIR 路徑中的目錄存在但卻非真正的目 ELOOP 欲打開的文件有過多符號連接問題,上限為16符號連接 EFAULT 參數(shù)buf為無效指針,指向無法存在的內(nèi)存空間 EACCESS 存取文件時被拒絕 ENOMEM 核心內(nèi)存不足 ENAMETOOLONG 參數(shù)file_name的路徑名稱太長數(shù)值

常用:

if (argc==1){printf("Please Enter a path to at least one file");exit(-1);}else{while(--argc){if (0 != stat(*++argv, &file_stat)) //call stat function{perror("stat");exit(-1);}printf("%s:n",*argv);print_file_stat(&file_stat);}}

總結

以上是生活随笔為你收集整理的ubantu实现linux命令的实验_C语言实现linux命令---ls的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。