当前位置:首页 > Windows程序 > 正文

Windows、Linux下文件操作(写、删除)错误的产生原因、及解决方法

2021-05-25 Windows程序

0. 引言 1. Linux平台上涉及的File IO操作 2. Windows平台上涉及的File IO操作

0. 引言

本文试图讨论在windows、linux操作系统上基于C库进行文件IO操作时,可能遇到的错误,及其解决方法,主机安全攻防产品除了需要将安全攻防上的领域知识固化到程序实现上之外,还极度依赖关联系统本身、编程语言库的特性,原则上,并不是所有的安全需求都能100%地落实到程序设计中,这需要我们对操作系统、编程语言本身具有较深的理解

Relevant Link:

http:// http:// //搜索:0x3: 权限检查

1. Linux平台上涉及的File IO操作

0x1: 打开目录: opendir()

全磁盘遍历、文件IO操作的第一步是打开文件目录本身,在Linux中,文件和目录都统一用inode进行抽象

#include <sys/types.h> #include <dirent.h> DIR * opendir(const char * name); //返回值:成功则返回DIR* 型态的目录流, 打开失败则返回NULL

错误代码

1. EACCESS: 权限不足 2. EMFILE: 已达到进程可同时打开的文件数上限 3. ENFILE: 已达到系统可同时打开的文件数上限 4. ENOTDIR: 参数name非真正的目录 5. ENOENT: 参数name指定的目录不存在,或是参数name为一空字符串 6. ENOMEM: 核心内存不足

其中EACCESS(权限不足)是最经常遇到的问题

1. Each directory in the path name preceding the directory to be opened 1) 调用opendir,如果传入路径参数的各个分量中,有一个分量没有X权限,则返回Permission denied(EACCES)错误 2) 没有X权限,ll命令虽然可以列出该目录下的文件及目录,但是同样因为可执行(x)权限无法查看属性 3) cd命令需要可执行(x)权限,因此无法通过cd命令切换到该目录下,子目录也是不可切换的,即便对子目录有完整权限 4) 同样对于cat命令,由于缺少可执行(x)权限,该目录下的文件也是不可读的 5) 对于stat系统调用和cat命令是一样的,如果缺少x权限,则stat将执行失败 6) 没有x权限,目录下的文件也不能cp 7) 父目录没有x权限,即使该目录下的文件可读可执行,也无法执行该目录下的文件 //需要明白的是,Linux的目录寻址定位是逐个路径分量逐段进行的,如果父目录因为没有x权限受阻了,则即使目录下的子文件权限足够,也无法正常操作 2. The directory to be opened 如果传入的目录路径没有R权限, 则调用opendir返回Permission denied(EACCES)错误,没有R权限导致无法读取目录inode的元信息

我们梳理一下概念

1. 对于文件权限: 可读权限(r)是可执行(x)的基础,因为执行的前提是读取二进制数据 2. 对于目录权限: 可执行(x)权限是关键,没有可执行权限意味着所有命令都不能在该目录及子目录下执行,该目录及子目录下的文件也不能被执行。这意味着我们常用的命令cd、ls、mkdir、cp、mv、rm等等在该目录下全部失效

Relevant Link:

http://c.biancheng.net/cpp/html/319.html http://pubs.opengroup.org/onlinepubs/009695399/functions/opendir.html http://lxr.free-electrons.com/source/include/uapi/asm-generic/errno-base.h#L16 http://axisray.me/2015/01/04/linux-dir-and-file-permission/ http://os.51cto.com/art/201003/186949.htm

0x2: 读取目录: readdir()

#include <sys/types.h> #include <dirent.h> struct dirent * readdir(DIR * dir); /* 返回值 1. 成功则返回下个目录进入点 2. 有错误发生或读取到目录文件尾则返回NULL */

No authorization is required. Authorization is verified during opendir()
错误代码

1. EOVERFLOW One of the values in the structure to be returned cannot be represented correctly. The readdir() function may fail if: 2. EBADF The dirp argument does not refer to an open directory stream. 3. ENOENT The current position of the directory stream is invalid.

Relevant Link:

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70762.html