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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

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

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

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

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

看一下結(jié)果:

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

當(dāng)你輸入

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

此時(shí):

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

再說(shuō)一下readdir函數(shù)的特點(diǎn),接受一個(gè)Dir *參數(shù),返回一個(gè)dirent *

有個(gè)循環(huán):

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

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

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

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


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

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

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

源碼:

#include<stdio.h> #include<string.h> #include<dirent.h>void ls(char *dirpath);int main(int argc, char *argv[]) {if(argc==1)//沒(méi)有命令行參數(shù)時(shí),列出當(dāng)前目錄中的文件和目錄列表{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的文件的詳細(xì)信息,存儲(chǔ)在stat結(jié)構(gòu)體中,file_path既可以是文件路徑也可以是目錄路徑

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

總結(jié)

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

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