加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

【Linux】文件与目录的底层系统调用

发布时间:2022-11-02 15:06:30 所属栏目:Linux 来源:互联网
导读: 目录
一、文件和目录的维护
1.chmod系统调用
chmod系统调用可以用来改变文件或目录访问权限。
该函数原型为
#include
int chmod(const char *path,mode_t mode);
path参数指定的文件被修改

目录

一、文件和目录的维护

1.chmod系统调用

chmod系统调用可以用来改变文件或目录访问权限。

该函数原型为

#include
int chmod(const char *path,mode_t mode);

path参数指定的文件被修改为具有mode参数给出的访问权限。参数mode定义与open系统调用中的一样,也是对所要求的访问权限进行按位OR操作。除非程序被赋予适当的特权,否则只有文件的属主或者超级用户可以修改它的权限。

如下,补充一个chomd对文件修改的命令使用:

chmod修改文件权限命令_又秃又弱的博客-CSDN博客

2.chown系统调用

超级用户可以使用chown系统调用来改变一个文件的属主。

#include
#include
int chown(const char *path,uid_t owner,gid_t group);

这个调用使用的是用户ID和组ID的数字值(通过getuid和getgid调用获得)和一个用于限定谁可以修改文件属主的系统值。如果已经设置了设党的特权,文件的属主和所属主就会改变。

3.unlink、link和symlink系统调用

unlik删除文件的目录项并减少它的连接数,如果想调用该函数来成功删除文件,必须拥有该文件所属目录的写和执行权限。rm程序使用的就是这个调用。

#include
int unlink(const char *path);
int link(const char *path1,const char*path2);
int symlink(const char *path1,const char *path2);

4.mkdir和rmdir系统调用

#include
#include

linux命令系统_linux命令 查看系统_linux 查看系统版本命令

int mkdir(const char *path,mode_t mode);

#include
int rmdir(const char *path);

其余的常用命令可以访问该链接:【LINUX】常用的命令及解释_又秃又弱的博客-CSDN博客

5.chdir系统调用和getcwd函数

程序可以像用户在文件系统里那样来浏览目录。就像在shell里使用cd命令来切换目录一样,程序使用的是chdir系统调用。

#include
 
int chdir(const char*path);

程序可以通过调用getcwd函数来确定自己的当前工作目录

#include
char *getcwd(char *buf,size_t size);

getcwd函数把但其概念目录的名字写到给定的缓冲区buf里。如果目录名的长度超过了参数size给出的缓冲区长度(一个ERANGE错误),他就返回NULL,如果成功,他返回指针buf。

如果程序运行过程中,目录被删除(EINVAL错误)或者有关权限发生了变化(EACCESS错误),getcwd也可能会返回NULL。

二、扫描目录 前言

Linux系统上一个常见问题就是扫描目录,也就是确定一个特定目录下存放的文件。在shell程序设计中,这很容易做到——只需要让shell做一次表达式的通配符扩展。在过去,UNIX操作系统的各种变体都允许用户通过编程访问底层文件系统结构。我们仍然可以把目录当作一个普通文件那样打开,并直接读取目录数据项,但不通用的文件系统结构及其实现已经是这种方法没什么可移植性了。现在,一整套标准的库函数已经被开发出来,使得目录的扫描工作变得简单。

与目录文件操作有关的函数在dirent.h头文件中声明。他们使用一个名为DIR的结构作为目录操作的基础。被称为目录流的指向这个结构的指针(DIR*)被用来完成各种目录操作,其使用方法与原来操作普通文件的文件流(FILE*)非常相似。目录数据项本身则在dirent结构中返回,该结构也是在diret.h头文件里声明的,这是因为用户不应该直接改动DIR结构中的数据字段。

接下来,我们将介绍这几个函数

1.opendir

opendir函数的作用是打开一个目录并建立一个目录流。如果成功,返回一个指向DIR结构的指针,该指针用于读取目录数据流

#include
#include
DIR *opendir(const char*name);

opendir在失败时返回一个空指针。注意,目录流使用一个底层文件来访问目录本身,所以如果打开的文件过多,opendir可能会失败。

2.readdir

作用是打开文件。raddir函数返回一个指针,该指针指向的结构里保存着目录流dirp中下一个目录项的有关资料。后续的readdir调用将返回后续的目录项。如果发生错误或者到达目录尾,readir将返回NULL。POSIX兼容的系统在到达目录尾时会返回NULL,但并不改变errno的值,只有在发生错误时才会设置errno。

#include
#include
struct dirent *readdir(DIR *dirp);

注意,如果在readdir函数扫描目录的同时还有其它进程在该目录中创建或者删除文件,readdir将不保证能够列出该目录里的所有文件(和子目录)。

dirent结构中包含的目录项文件内容包含以下部分

想要进一步了解目录中的某个文件,我们需要使用在前面介绍过的stat调用。

3.telldir函数

作用是标记文件。telldir函数的返回值记录着一个目录流里的当前位置。我们可以在随后的seekdir调用中利用这个值来重置目录扫描到当前位置。

#include
#include
long int telldir(DIR* dirp);

4.seekdir函数

seekdir函数的作用是设置目录流dirp的目录项指针。loc的值用来设置指针位置linux命令系统,他应该通过前一个telldir调用获得。

#include
#include
void seekdir(DIR *dirp,long int loc);

5.closedir函数

closedir函数关闭一个目录流并释放与之关联的资源。他在执行成功时返回0,发生失败时返回-1.

#include
#include
int closedir(DIR *dirp);

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!