linux——07目录io和链接io

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、目录流指针

1.函数接口

	1.opedir
	DIR *opendir(const char *name)
	功能:
		打开目录获得目录流指针
	参数:
		name:目录的路径
	返回值:
	成功返回目录流指针
	失败返回NULL
	2.closedir
	int closedir(DIR* drip);
	功能
		关闭一个目录流指针
	3.readdir
	struct dirent *readdir(DIR *dirp);
	功能:
		从目录流指针种读取下一个目录流信息
	参数:
		drip目录流指针
	返回值:
		成功返回目录流信息
		失败或者读到末尾返回Null
		 struct dirent {
               ino_t          d_ino;       /* inode number 通过该节点可知道位于磁盘的存储位置*/
               off_t          d_off;       /* offset to the next dirent 下一个目录的偏移量*/
               unsigned short d_reclen;    /* length of this record */
               unsigned char  d_type;      /* type of file; not supported
                                              by all file system types 文件类型 */
               char           d_name[256]; /* filename 文件名*/
           };
	4.getcwd
	 char *getcwd(char *buf, size_t size);
	功能:
		获得当前工作路径下的绝对路径
		
	参数:
		buf:存放路径字符串空间的首地址
		size:最多存放字符串的个数
		
	返回值:
		成功返回字符串的首地址
		失败返回NULL
                                                                                         

	5.chdir
	int chdir(const char *path);
	功能:
		改变当前的工作路径
	path:
		路径字符串的首地址
	返回值
		成功:返回0
		失败:返回-1
	6.mkdir
	int mkdir(const char *pathname, mode_t mode);
	功能:
		创建一个目录
	参数:
		pathname 创建目录名称
		mode 权限
	返回值:
		成功返回0 
		失败返回-1
	r:读取该目录下的文件
	w:在目录下不能创建文件
	x:能否进去这个目录文件
	umask = 2
	7.rmdir
	int rmdir(const char *pathname);
	功能:删除目录
	7.remove
	int remove(const char *pathname);
	功能:删除普通文件

二、关于目录相关实现的功能

1.ls

代码如下(示例):


#include "head.h"
//遍历当前路径下文件
int main(int argc, const char *argv[])
{
	//打开目录
	DIR * dp = opendir(".");
	if(NULL == dp)
	{
		perror("opendir error");
		return -1;
	}
	//定义读目录结构体
	struct dirent * pp =NULL;
	while(1)
	{
		//每次读取一个文件名
		pp = readdir(dp);
		if(NULL == pp)
		{
			break;
		}
		//如果是目录文件则跳过
		if( pp->d_name[0] == '.')
		{
			continue;
		}
		printf("%s\n",pp->d_name);
	}
	closedir(dp);
	return 0;
}

2.cd

#include "head.h"

int main(int argc, const char *argv[])
{
	char buf[256] = {0};
	char *p  = NULL;
	char word[256] = {0};
	char *p1 = NULL;
	while(1)
	{
		p = getcwd(buf,256);
		printf("linux@ubuntu:~%s",p);
		gets(word);
		if( 0 == strcmp(word,"#quit"))
		{
			break;
		}
		strtok(word," ");
		p1 = strtok(NULL," ");
		chdir(p1);
	}
	return 0;
}

3.ls递归版

#include "head.h"
//递归函数
void dir_cur(const char * dir_name)
{
	DIR * dp = opendir(dir_name);
	struct dirent * pp =NULL;
	struct stat buf;
	char tempbuf[4096] = {0};
	int ret = 0;
	if(NULL == dp)
	{
		perror("opendir error");
		return ;
	}
	while(1)
	{
		//遍历目录
		pp = readdir(dp);
		if(NULL == pp)
		{
			break;
		}
		//如果是当前路径或者上一级路径则跳过
		if( pp->d_name[0] == '.')
		{
			continue;
		}
		//pp_d_name 为当前文件夹的路劲,用函数调用的时候需要拼接路劲
		sprintf(tempbuf,"%s/%s",dir_name,pp->d_name);
		printf("%s\n",pp->d_name);
		ret = lstat(tempbuf,&buf);
		if(-1 == ret)
		{
			perror("stat error");
			return ;
		}
		//如果是路径循环调用该函数
		if( S_ISDIR(buf.st_mode))
		{
			dir_cur(tempbuf);
		}
	}
	closedir(dp);
	return ;
}
int main(int argc, const char *argv[])
{
	if( argc != 2)
	{
		printf("input error\n");
		return -1;
	}

	dir_cur(argv[1]);
	return 0;
}

2.目录递归遍历

三、链接io

1.概念

链接文件类似于windows下的快捷方式
1.软链接
	通过文件名来链接
	ln -s 链接向的文件 链接文件名
	rm删除之后,不能用,但是创建之后可以用 
	链接存在为蓝色
	链接不存在为红色
2.硬链接
	通过i_node节点进行链接
	ln 链接向的文件 链接文件名

在这里插入图片描述

2.函数接口

	man 2 link
	1.link
	int link(const char *oldpath, const char *newpath);
	功能
		创建一个硬链接功能
	参数:
		oldpath:已存在的文件
		newpath:链接文件
	返回值
		成功返回0
		失败返回-1
	2.symlink
	int symlink(const char *oldpath, const char *newpath)
	功能:创建一个软连接
	参数:
		oldpath:已存在的文件
		newpath:链接文件
	返回值
		成功返回0
		失败返回-1
	man 3 readlink
	3.ssize_t readlink(const char *restrict path, char *restrict buf,
              size_t bufsize);
	功能:读取软连接文件中存放的内容
	参数:		restrict 
		path软连接的路径
		buf 存放数据空间的首地址
		bufsize:最多读取字符个数
	返回值:
		成功返回字节数
		失败返回-1
	4.unlink
	int unlink(const char *pathname);
	功能:
	让pathname对应的硬链接个数减一
	注意:如果为0 则删除链接文件
		

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这种情况通常是由于在编译内核时,缺少某些必需的库或模块,导致连接器无法找到定义该符号的位置。解决方法如下: 1. 确认是否安装了必需的库和模块。 查看编译器报错信息中指示的缺失符号所在的头文件、库文件或模块是否已经安装。例如,报错信息中提到了 psinfo 符号,那么就需要检查相关的 ps 库文件是否已经安装,并且检查编译器命令中是否链接了该库。 2. 确认编译选项是否正确。 检查编译内核时所使用的命令行选项是否正确。确保使用了正确的编译器,以及指定了正确的内核源码路径和输出路径。可能还需要增加一些选项来告诉连接器从哪里查找缺失的符号。例如: gcc -o vmlinux -L/usr/local/lib -lpsinfo irqbypass.c 表示链接器在 /usr/local/lib 目录下查找 libpsinfo 库文件。如果库文件不在标准位置下,就需要使用 -L 选项来指定库文件路径。 3. 检查编译内核时是否添加了必要的补丁或模块。 有些内核功能需要添加特定的补丁或模块才能支持。如果报错信息中提示缺失的符号是某个内核模块中的函数或变量,就需要检查该模块是否已经正确安装。如果还没有安装,就需要先添加该模块再重新编译内核。 4. 清除编译过程中的临时文件。 有时编译过程中生成了一些临时文件,如果这些文件中的某个版本出错了,就可能导致编译出错。可以使用命令 make mrproper 清除所有编译过程中生成的临时文件,然后重新编译内核。 综上所述,处理 Linux 的编译报错需要综合考虑多种因素,包括库文件、编译选项、内核模块、临时文件等等。针对具体的报错信息,采取相应的解决方法,才能最终消除错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值