• Linux中文件函数(一)


    一、stat、fstat、fstatat、lstat函数

       函数的原型为:

    #include <sys/stat.h>
    int stat(const char *restrict pathname,struct stat *restrict buf);
    int fstat(int fd,struct stat *buf);
    int lstat(const char *restrict pathname,struct stat *restrict buf);
    int fstatat(int fd,const char *restrict pathname,struct stat *restrict buf,int flag);

       给出pathname,stat函数将返回与此命名文件有关的信息结构。fstat函数获得在描述符fd上打开的有关信息。

    lstat返回该符号链接的有关信息,而不是由该符号链接引用的文件的信息。fstatat函数为一个相对于当前打开

    目录(由fd参数指向)的路径名返回文件统计信息,flag参数控制着是否跟随着一个符号链接。当AT_SYMLINK_N

    OFOLLOW标志被设置时,fstatat不会跟随符号链接,而是返回符号链接本身的信息。否则,在默认情况下,返回

    的是符号链接所指向的实际文件的信息。如果fd参数的值是AT_FDCWD,并且pathname参数是一个相对路径名,fs

    tatat会计算相对于当前目录的pathname参数。如果pathname是一个绝对路径,fd参数就会被忽略。这两种情况下

    ,根据flag的取值,fstatat的作用就跟stat或lstat一样。第2个参数buf是一个指针,它指向一个必须提供的结

    构。函数来填充由buf指向的结构。

    二、access、faccessat函数

       当用open函数打开一个文件时,内核以进程的有效用户ID和有效组ID为基础执行其访问权限测试。有时,进程

    也希望按其实际用户ID和实际组ID来测试其访问能力。即使一个进程可能已经通过设置用户ID以超级用户权限运行

    ,它仍可能想验证其实际用户能否访问一个给定的文件。access和faccessat函数是按实际用户ID和实际组ID进行

    访问权限测试的。该函数原型为:

    #include <unistd.h>
    int access(const char *pathname,int mode);
    int faccessat(int fd,const char *pathname,int mode,int flag);

      其中,如果测试文件是否已经存在,mode就为F_OK;否则mode是这些常量的按位或:R_OK,测试读权限;W_OK,测

    试写权限;X_OK,测试执行权限。faccessat函数与access函数在下面两种情况下是相同的:一种是pathname参数为

    绝对路径,另一种是fd参数取值为AT_FDCWD而pathname参数为相对路径。否则,faccessat计算相对于打开目录(由

    fd参数指向)的pathname。flag参数可以用于改变faccessat的行为,如果flag设置为AT_EACCESS,访问检查用的是

    调用进程的有效用户ID和有效组ID,而不是实际用户ID和实际组ID。

    三、umask函数

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

    #include <sys/stat.h>
    mode_t umask(mode_t cmask);

       其中,参数cmask是由这些9个常量中的若干个按位或构成的。S_IRUSR:用户读;S_IWUSR:用户写;S_IXUSR:

    用户执行;S_IRGRP:组读;S_IWGRP:组写;S_IXGRP:组执行;S_IROTH:其它读;S_IWOTH:其它写;S_IXOTH:

    其它执行。在进程创建一个新文件或新目录时,就一定会使用文件模式创建屏蔽字。在文件模式创建屏蔽字中为1

    的位,在文件mode中的相应位一定被关闭。

    四、chmod、fchmod、fchmodat函数

       chmod、fchmod和fchmodat这3个函数使我们可以更改现有文件的访问权限。函数的原型为:

    #include <sys/stat.h>
    int chmod(const char *pathname,mode_t mode);
    int fchmod(int fd,mode_t mode);
    int fchmodat(int fd,const char *pathname,mode_t mode,int flag);

       chmod函数在指定的文件上进行操作,而fchmod函数则对已打开的文件进行操作。fchmodat函数与chmod函数在

    下面两种情况下是相同的:一种是pathname参数为绝对路径,另一种是fd参数取值为AT_FDCWD而pathname参数为相

    对路径。否则,fchmodat计算相对于目录(由fd参数指向)的pathname。flag参数可以用于改变fchmodat的行为,

    当设置了AT_SYMLINK_NOFOLLOW标志时,fchmodat并不会跟随符号链接。为了改变一个文件的权限位,进程的有效用

    户ID必须等于文件的所有者ID,或者该进程必须具有超级用户权限。

    五、chown、fchown、fchownat、lchown函数

       下面的几个chown函数可用于更改文件的用户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_t owner,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);

      除了所引用的文件是符号链接外,这4个函数的操作类似。在符号链接情况下,lchown和fchownat(设置了AT_SYM

    LINK_NOFOLLOW标志)更改符号链接本身的所有者,而不是该符号链接所指向的文件的所有者。fchown函数改变fd参数

    指向的打开文件的所有者,既然它在一个已打开的文件上操作,就不能用于改变符号链接的所有者。

      fchownat函数与chown或者lchown函数在下面两种情况下是相同的:一种是pathname参数为绝对路径,另一种是fd参

    数取值为AT_FDCWD而pathname参数为相对路径。在这两种情况下,如果flag参数中设置了AT_SYMLINK_NOFOLLOW标志,

    fchownat与lchown行为相同,如果flag参数中清除了AT_SYMLINK_NOFOLLOW标志,则fchownat与chown行为相同。如果

    fd参数设置为打开目录的文件描述符,并且pathname参数是一个相对路径名,fchownat函数计算相对于打开目录的pa

    thname。

  • 相关阅读:
    ERROR: epmd error for host "yourhostname": timeout
    leetcode485
    leetcode463
    leetcode496
    leetcode344
    leetcode412
    leetcode500
    leetcode476
    leetcode557
    leetcode461
  • 原文地址:https://www.cnblogs.com/XNQC1314/p/9241415.html
Copyright © 2020-2023  润新知