APUE学习笔记-第四章-文件和目录

第四章 文件和目录

1、函数stat、fstat、fstatat和lstat

#include<sys/stat.h>
Intstat(const char *restrict pathname,struct stat *restrict buf);
Intfstat(int fd,struct stat *buf);
Intlstat(const char *restrict pathname,struct stat *restrict buf);
Intfstatat(int fd,const char *restrict pathname,struct stat *restrict buf,intflag);
返回值:若成功,返回0;若出错,返回-1。

stat函数能根据pathname得到以此name命名的文件的信息结构。

lstat能够根据pathname得到以此name命名的连接文件的信息结构。lstat列出的是符号连接文件本身,而不是连接引用的文件。用途:需要以降序遍历目录层次结构时。

fstatat根据文件描述符得到相应文件的信息结构。

fstatat函数操作的函数为:由fd参数指向的相对于当前打开目录的路径名,返回文件统计信息。

struct stat {
   dev_t        st_dev;       //文件的设备编号
   ino_t        st_ino;       //节点
   mode_t       st_mode;      //文件的类型和存取的权限
   nlink_t       st_nlink;    //连到该文件的硬连接数目,刚建立的文件值为1
   uid_t        st_uid;       //用户ID
   gid_t        st_gid;       //组ID
   dev_t        st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
   off_t        st_size;      //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;   //块数
   time_t       st_atime;     //最后一次访问时间
    time_t       st_mtime;     //最后一次修改时间
   time_t       st_ctime;     //最后一次改变时间(指属性)
};

 

2、函数access和faccessat

    按实际用户ID和实际组ID进行访问测试访问能力。

#include<unistd.h>
Int access(const char *pathname,intmode);
Int faccessat(int fd, const char*pathname,int mode,int flag);
返回值:若成功,返回0,若失败,返回-1.

    两个函数在下面两种情况下是相同的:一种是pathname参数为绝对路径,另一种是fd参数取值为AT_FDCWD而pathname参数为绝对路径;否则faccessat计算相对于打开目录的pathname。

 

3、函数umask

    函数umask为进程设置文件模式创建屏蔽字,并返回之前的值。

#include<sys/stat.h>
mode_tumask(mode_t mode);
返回值:之前的文件模式创建屏蔽字。

    在文件模式创建屏蔽字中为1的位,在文件mode中的相应位一定被关闭。

示例:umask(0001);禁止其他执行;

 

4、函数chmod、fchmod和fchmodat

    这三个函数可以使我们更改现有文件的访问权限

#include<sys/stat.h>
Int chmod(constchar *pathname,mode_t mode);
Int fchmod(intfd,mode_t mode);
Int fchmodat(intfd,const char *pathname,mode_t mode,int flag);
返回值:若成功,返回0;若出错,返回-1.

    函数chmod在指定的文件上进行操作,fchmod函数则对已打开的文件进行操作;fchmodat与chmod函数类似(绝对/相对路径名)

宏定义

说明

S_ISUID

04000

设置用户权限

S_ISGID

02000

设置组用户权限

S_ISVTX

01000

设置sticky位

S_IRUSR

00400

文件所有者的读权限

S_IWUSR

00200

文件所有者的写权限

S_IXUSR

00100

文件所有者的执行权限或目录搜索权限

S_IRGRP

00040

组用户的读权限

S_IWGRP

00020

组用户的写权限

S_IXGRP

00010

组用户的执行权限或目录搜索权限

S_IROTH

00004

其他用户的读权限

S_IWOTH

00002

其他用户的写权限

S_IXOTH

00001

其他用户的执行权限和目录搜索权限

示例:chmod( path, 0700) ;

5、函数chown、fchown、fchownat和lchown

    下面几个函数可用于更改文件的用户ID和组ID。如果两个参数owner或group中的任意一个是-1,则对应的ID不变。

#include<unistd.h>
Int chown(const char*pathname,uid_t owner,gid_t group);
Int fchown(int fd,uid_towner,gid_t group);
Int fchownat(int fd,const char*pathname,uid_t owner,gid_t group,int flag);
Int lchown(const char*pathname,uid_t owner,gid_t group);
返回值:若成功,返回0;若出错,返回-1.

    除了所引用的文件是符号链接以外,这四个函数的操作类似。在符号链接情况下,lchown和fchownat更改符号连接本身的所有者,而不是该符号链接所指向的文件的所有者。

 

6、文件系统

https://blog.csdn.net/men_wen/article/details/52972678

    传统的UNIX系统V文件系统,可以将一个硬盘分为多个分区,每个分区可以包含一个文件系统

i节点是固定长度的记录项,包含有关文件的信息。

 


7、函数link、linkat、unlink、unlinkat和remove

    任何一个文件可以有多个目录项指向其i节点。创建一个指向现有文件的连接的方法是使用link函数或linkat函数。

#include<unistd.h>
Intlink(const char *existingpath,const char *newpath);
Int linkat(intfd,const char *existingpath,int nfd,const char *newpath,int flag);
两个函数返回值:若成功,返回0;若出错,返回-1.

这两个函数创建一个新目录项,它引用现有文件existingpath

    为了删除一个现有的目录项,可以调用unlink函数。

#include<unistd.h>
Int unlink(constchar *pathname);
Int unlinkat(intfd,const char *pathname,int flag);
两个函数返回值:若成功,返回0;若出错,返回-1.

    这两个函数删除目录项,并将有pathname所引用文件的链接计数减1.只有当链接计数达到0时,该文件的内容才可被删除。

    也可以用remove函数解除对一个文件或目录的链接,对于文件,其功能与unlink相同,对于目录,其功能与rmdir相同

#include<stdio.h>
Int remove(constchar* pathname);

 

8、函数rename和renameat

    文件或目录可以用rename或者renameat函数进行重命名。

#include<stdio.h>
Int rename(constchar *oldname,const char *newname);
Int renameat(intoldfd,const char *oldname,int newfd,const char *newname);
两个函数返回值:若成功,返回0;若失败,返回-1

 

9、函数mkdir、mkdirat和rmdir

    用mkdir和mkdirat函数创建目录,用rmdir删除目录。

#include<sys/stat.h>
Int mkdir(constchar *pathname,mode_t mode);
Int mkdirat(intfd,const char *pathname,mode_t mode);
两个函数返回值:若成功,返回0;若出错,返回-1.
#include<unistd.h>
Int rmdir(constchar *pathname);
返回值:若成功,返回0;若出错,返回-1.

 

10、函数chdir、fchdir和getcwd

    进程调用chdir或fchdir函数可以更改当前工作目录。

#include<unistd.h>
Int chdir(constchar *pathname);
Int fchdir(intfd);
两个函数返回值:若成功,返回0;若出错,返回-1.

    在两个函数中,分别用pathname或打开文件描述符来指定新的当前工作目录。

示例:chdir(“/tmp”);

    函数getcwd可以得到当前工作目录完成的绝对路径名。

#include<unistd.h>
char *getcwd(char*buf,size_t size);
返回值:若成功,返回buf;若出错,返回NULL。

    两个参数,一个是缓冲区地址buf,另一个是缓冲区长度。


https://blog.csdn.net/men_wen/article/details/52972678

猜你喜欢

转载自blog.csdn.net/m0_38099899/article/details/80043610