ubantu实现linux命令的实验_C语言实现linux命令---ls
ls
输出一个文件名的列表,它是这样工作的
open directory;
while(!(end of dir))
{read file info;
}
open directory
看一下结果:
难点还是main函数的参数变化,就是我们只输入./myls1 着就相当于main获得一个参数,也就是argc=1,*argv=“./myls1 ”
当你输入
./myls1 ../ls ../camke-build-debug
此时:
argc=3;
*argv=“./myls1 ”;
*(argv+1) = “ ../ls ”;
*(argv+2) = “ ../camke-build-debug”;
再说一下readdir函数的特点,接受一个Dir *参数,返回一个dirent *
有个循环:
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),循环体里面肯定会有i--之类的
容易发现循环条件是(pdirent=readdir(pDir)) != NULL,在循环体内找不到关于dirent的代码,其实readdir(pDir)的返回值每次都不一样,它会返回目录下的所有文件结构体直到返回NULL
opendir(const char *pathname)函数 接受一个路径,打开这个路径下的目录,成功则返回DIR*型态的目录,失败则返回NULL
opendir只能打开目录路径,如果时./mian.c这种单个文件是打不开的(这是不是表明Dir只能表示目录)
综上,我们想获取一个目录下所有文件名(包括目录,目录也是文件)需要以下几步:
- 调用opendir函数并传入目录所在路径char *类型(此时应该判断是不是打开成功)
- 循环调用readdir函数并传入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)//没有命令行参数时,列出当前目录中的文件和目录列表{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);}
}
函数stat的作用是获取文件路径为file_path的文件的详细信息,存储在stat结构体中,file_path既可以是文件路径也可以是目录路径
int stat(const char *file_path, struct stat *buf);
执行成功则返回0,失败返回-1,错误代码存于errno
错误代码:
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长数值
常用:
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相关推荐
- 实验一 linux命令使用,实验一XXXXX常用linux命令的使用(一)
以下为<实验一XXXXX常用linux命令的使用(一)>的无排版文字预览,完整格式请下载 下载前请仔细阅读文字预览以及下方图片预览.图片预览是什么样的,下载的文档就是什么样的. 实验一 常 ...
- c语言程序命令行,ttyd(C语言编写的命令行程序) v1.3.1 免费版
ttyd是一个C语言编写的命令行程序,可以把任意命令行程序分享到网页上操作,可以看做是个网页版的远程终端,支持 Linux.macOS 系统,还可以运行在 OpenWrt 之类的嵌入式系统上. 功能特 ...
- xshell命令大全编译c语言,Xshell常用命令大全
suse linux 常用命令 (1)命令ls--列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的"隐藏"文件 ls a* 列出当前目录下以字母a开头的 ...
- micropython编译原理_C语言嵌入式Linux高级编程第9期:CPU和操作系统入门视频课程...
嵌入式开发是一门交叉学科. 它要求我们的嵌入式工程师,不仅学习C语言.汇编.软件工程等软件层面的知识技能,还要求对CPU内部工作机制.计算机系统架构.操作系统原理.编译器等都有一个全局的认识和把握. ...
- c语言tty,1. 终端_C语言_C语言入门-Linux C编程一站式学习
1.2. 终端登录过程 一台PC通常只有一套键盘和显示器,也就是只有一套终端设备,但是可以通过Ctrl-Alt-F1~Ctrl-Alt-F6切换到6个字符终端,相当于有6套虚拟的终端设备,它们共用同一 ...
- linux下如何用c语言调用shell命令-转
C程序调用shell脚本共有三种法子 :system().popen().exec系列函数 system()不用你自己去产生进程,它已经封装了,直接加入自己的命令exec 需要你自己 fork 进程, ...
- 位运算 c语言 头文件 linux,1. 位运算_C语言_C语言入门-Linux C编程一站式学习...
1.2. 移位运算 移位运算符(Bitwise Shift)包括左移<>.左移将一个整数的各二进制位全部左移若干位,例如0xcfffffff3<<2得到0x3fffffcc: ...
- linux 析构函数地址获取_c语言中有析构函数吗
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- 嵌入式linux系统蜂鸣器实验,「正点原子Linux连载」第四十六章Linux蜂鸣器实验
1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 大家将imx35_gpio_hwdata ...
最新文章
- 介绍两个非常好用的Javascript内存泄漏检测工具
- 全球首个「活体机器人」生娃!100%青蛙基因,杀不死,可繁衍4世
- 日周月筛选器_天谕2.09月3日周版本更新维护内容预告
- MYSQL 设计数据结构注意事项
- linux黄金命令[积累中]
- python将数字转为0010_用Python将HTML转为PDF。
- regedit start mysql_MySQL安装完成配置的时候start service报错
- 11个高效的VS调试技巧
- 波音正在对737 Max进行软件升级 改善飞行员培训计划
- fmea软件_新版FMEA易错点梳理(一):范围界定和过程流程图-SGS
- Linux TCP 性能調優筆記
- Total Commander 使用技巧
- 由《炮灰模型——女生选择追求者模型》到“微软钻石题”
- 离线式echarts模拟百度迁徙的实现
- windows vcpkg下载慢
- Excel---饼图美化与ppt图表
- 如何给Word参考文献加方括号
- epoch如何设置,在Keras中,steps_per_epoch和纪元的设置如何影响训练结果?
- A - Faulty Odometer
- 五笔打字怎么学,负基础