134 Linux 系统编程11 ,readlink命令,文件目录rwx权限差异,目录操作函数

前面知道,如果a.soft是一个软链接,我们使用 cat a.soft,会直接查看这个软链接指向的文件

那么我们就是想看这个软链接是啥,可以使用 readlink a.soft

二 获取工作目录 getcwd函数

获取进程当前工作目录 (卷3,标库函数)

size 为buf 的大小。

char *getcwd(char *buf, size_t size); 成功:buf中保存当前进程工作目录位置。失败返回NULL。

成功则 将buf中的数据 作为返回值返回;也就是说,在成功的情况下,返回值和buf中的值是一样的。

失败,则返回 NULL,一般当size 不够大,放不下的时候,就会返回null

三 改变当前进程的工作目录

改变当前进程的工作目录

int chdir(const char *path); 成功:0;失败:-1设置errno为相应值

复制代码
int main() {
	char nowpath[128];
	getcwd(nowpath,sizeof(nowpath));
	cout << "nowpath = " <<nowpath <<  endl;

	int ret  = chdir("/home/hunandede/projects/linuxcpp/aaa");// aaa 目录是真实存在的 ret =0
	//int ret = chdir("/home/hunandede/projects/linuxcpp/bbb");//bbb目录不存在, ret=-1
	//另一个问题是 chdir虽然成功了,但是意义在哪里,这个当前文件肯定是指的 可执行文件的路径了,改变目录也不会将 执行文件 拷贝到 aaa目录

	cout << "ret = " << ret << endl;

	getcwd(nowpath, sizeof(nowpath));
	cout << "nowpath = " << nowpath << endl;


	return 0;
}

四。文件,目录权限

注意:目录文件也是"文件"。其文件内容是该目录下所有子文件的目录项dentry。 可以尝试用vim打开一个目录。

文件 和 目录 的 RWX的权限 ,对应的操作也不同

|----|------------------|-------------------|------------|
| | r | w | x |
| 文件 | 文件的内容可以被查看 | 内容可以被修改 | 可以运行产生一个进程 |
| | cat、more、less... | vi、> ... | ./文件名 |
| | | | |
| 目录 | 目录可以被浏览 | 创建、删除、修改文件 | 可以被打开、进入 |
| | ls、tree... | mv、touch、mkdir... | cd |

目录设置黏住位:若有w权限,创建不变,删除、修改只能由root、目录所有者、文件所有者操作。

opendir函数

根据传入的目录名打开一个目录 (库函数) DIR * 类似于 FILE *

DIR *opendir(const char *name); 成功返回指向该目录结构体指针,失败返回NULL

参数支持相对路径、绝对路径两种方式:例如:打开当前目录:① getcwd() , opendir() ② opendir(".");

closedir函数

关闭打开的目录

int closedir(DIR *dirp); 成功:0;失败:-1设置errno为相应值

readdir函数

读取目录 (库函数)

struct dirent *readdir(DIR *dirp); 成功返回目录项结构体指针;失败返回NULL设置errno为相应值

需注意返回值,读取数据结束时也返回NULL值,所以应借助errno进一步加以区分。

struct 结构体:

struct dirent {

ino_t d_ino; inode编号

off_t d_off;

unsigned short d_reclen; 文件名有效长度

unsigned char d_type; 类型(vim打开看到的类似@*/等)

**char d_name[256];**文件名

};

其成员变量重点记忆两个:d_ino、d_name。实际应用中只使用到d_name。

练习1:实现简单的ls功能。 【imp_ls.c】

练习2:实现ls不打印隐藏文件。每5个文件换一个行显示。 【imp_ls2.c】

拓展1:实现ls -a -l 功能。

拓展2:统计目录及其子目录中的普通文件的个数

相关推荐
福大大架构师每日一题18 分钟前
nginx 1.30.0稳定版深度解析:Early Hints、HTTP/2后端、MPTCP全量上线,1.29.x分支精华全面整合
运维·nginx·http
Paraverse_徐志斌23 分钟前
Linux 内核与 Zero-Copy 零拷贝
linux·运维·内核·零拷贝
繢鴻1 小时前
Nginx 配置顺序错误
运维·nginx·阿里云·持续部署
木雷坞1 小时前
2026年4月实测:K8s containerd 镜像拉取全方案汇总
运维·容器·kubernetes
℡終嚸♂6801 小时前
Vite 开发服务器文件读取 Writeup
运维·服务器·状态模式
小苗卷不动1 小时前
UDP服务端收发流程
linux·c++·udp
开开心心_Every1 小时前
动图制作工具,拆分转视频动态照离线免费
运维·前端·人工智能·edge·pdf·散列表·启发式算法
薛定猫AI1 小时前
【技术干货】OpenAI Codex 重大更新:从代码补全工具到全流程智能开发平台
运维·人工智能
一个人旅程~1 小时前
让你老旧电脑复活方案之linux拯救旧电脑神器—-安装linuxmint后使用手机或外置无线网卡实现(免驱动)快速上网功能
linux·经验分享·电脑
曦云沐2 小时前
Linux 下极简安装 Conda(Miniconda / Anaconda),5 分钟搞定环境配置
linux·运维·conda