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

目录

一、文件和目录的维护

1.chmod系统调用

2.chown系统调用

3.unlink、link和symlink系统调用

4.mkdir和rmdir系统调用

5.chdir系统调用和getcwd函数

二、扫描目录

前言

1.opendir

2.readdir

3.telldir函数

4.seekdir函数

5.closedir函数


一、文件和目录的维护

1.chmod系统调用

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

该函数原型为

#include<sys/stat.h>

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

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

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

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

2.chown系统调用

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

#include<sys/types.h>
#include<unistd.h>

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

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

3.unlink、link和symlink系统调用

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

#include<unistd.h>

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

4.mkdir和rmdir系统调用

  • mkdir创建目录
#include<sys/types.h>
#include<sys/stat.h>

int mkdir(const char *path,mode_t mode);
  • rmdir删除目录,但只有目录为空时才行。
#include<unistd.h>

int rmdir(const char *path);

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

5.chdir系统调用和getcwd函数

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

#include<unistd.h>
 
int chdir(const char*path);

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

#include<unistd.h>

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结构中的数据字段。

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

  • opendir
  • readdir
  • telldir
  • seekdir
  • closedir

1.opendir

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

#include<sys/types.h>
#include<dirent.h>

DIR *opendir(const char*name);

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

2.readdir

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

#include<sys/types.h>
#include<dirent.h>

struct dirent *readdir(DIR *dirp);

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

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

  • ino_t d_ino:文件的inode节点号
  • char d_name[]:文件的名字

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

3.telldir函数

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

#include<sys.types.h>
#include<dirent.h>

long int telldir(DIR* dirp);

4.seekdir函数

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

#include<sys/types.h>
#include<dirent.h>

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

5.closedir函数

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

#include<sys/types.h>
#include<dirent.h>

int closedir(DIR *dirp);

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值