zoukankan      html  css  js  c++  java
  • [Linux]APUE读书笔记: 文件和目录

    stat, fstat, fstatat 和 lstat函数:

    1. stat函数返回与pathname命名文件相关的信息结构;
    2. fstat函数返回已在文件描述符fd打开文件的相关信息;
    3. lstat函数与stat函数类似,但当命名文件是一个符号链接时,返回该符号链接的相关信息;
    4. fstatat函数为相对于当前打开目录(有fd参数指向)的路径名返回文件统计信息。
    5. struct stat 的具体定义如下图:

    文件类型:

    1. 文件类型包括:普通文件,目录文件,块特殊文件,字符特殊文件,FIFO,套接字和符号链接,文件类型由stat结构中的st_mode表示;
    2. 对每个命令行参数打印文件类型:
     1 #include "apue.h"
     2 
     3 int main(int argc, char *argv[])
     4 {
     5     int                i;
     6     struct stat        buf;
     7     char             *ptr;
     8 
     9     for (i = 1; i < argc; i++)
    10     {
    11         printf("%s: ", argv[i]);
    12         if (lstat(argv[i], &buf) < 0) 
    13         {
    14             err_ret("lstat error");
    15             continue;
    16         }
    17 
    18         if (S_ISREG(buf.st_mode))
    19         {
    20             ptr = "regular";
    21         }
    22         else if (S_ISDIR(buf.st_mode))
    23         {
    24             ptr = "directory";
    25         }
    26         else if (S_ISCHR(buf.st_mode))
    27         {
    28             ptr = "character special";
    29         }
    30         else if (S_ISBLK(buf.st_mode))
    31         {
    32             ptr = "block special";
    33         }
    34         else if (S_ISFIFO(buf.st_mode))
    35         {
    36             ptr = "fifo";
    37         }
    38         else if (S_ISLNK(buf.st_mode))
    39         {
    40             ptr = "symbolic link";
    41         }
    42         else if (S_ISSOCK(buf.st_mode))
    43         {
    44             ptr = "socket";
    45         }
    46         else {
    47             ptr = "** unknown mode **";
    48         }
    49 
    50         printf("%s
    ", ptr);
    51     }
    52 
    53     exit(0);
    54 }
    View Code

     设置用户ID和设置组ID:

    1. 实际用户ID和实际组ID登陆时取自登陆口令;有效用户ID和有效组ID以及附属组ID决定文件访问权限;保存的设置用户ID和保存的设置组ID在执行程序时包含了有效用户ID和有效组ID的副本;
    2. 通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID;
    3. 设置用户ID(set-user-id):当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID;设置组ID(set-group-id):当执行此文件时,将进程的有效组ID设置为文件所有者的组ID。

    新文件和目录的所有权:

    1. 新文件的用户ID设置为进程的有效用户ID;
    2. 对于Linux 3.2.0,默认情况下,新文件的组ID取决于它所在的目录的设置组ID位是否被设置,如果被设置,新文件组ID设置为目录的组ID,否则设置为进程的有效组ID。

    函数access和faccessat:

    1. access和faccessat函数是按实际用户ID和实际组ID进行访问权限测试的;
    2. access函数实例:
     1 #include "apue.h"
     2 #include <fcntl.h>
     3 
     4 int main(int argc, char *argv[])
     5 {
     6     if (argc != 2)
     7     {
     8         err_quit("usage: a.out <pathname>");
     9     }
    10 
    11     if (access(argv[1], R_OK) < 0)
    12     {
    13         err_ret("access error for %s", argv[1]);
    14     }
    15     else 
    16     {
    17         printf("read access ok
    ");
    18     }
    19 
    20     if (open(argv[1], O_RDONLY) < 0)
    21     {
    22         err_ret("open error for %s", argv[1]);
    23     }
    24     else 
    25     {
    26         printf("open for reading ok
    ");
    27     }
    28 
    29     exit(0);
    30 }
    View Code

     函数umask:

    1. umask函数为进程设置文件模式创建屏蔽字;
    2. 在文件模式创建屏蔽字中为1的位,在文件mode中相应位一定被关闭(异或);
    3. umask函数实例:
     1 #include "apue.h"
     2 #include <fcntl.h>
     3 
     4 #define RWRWRW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
     5 
     6 int main(void)
     7 {
     8     umask(0);
     9     if (creat("foo", RWRWRW) < 0)
    10     {
    11         err_sys("creat error for foo");
    12     }
    13 
    14     umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
    15     if (creat("bar", RWRWRW) < 0)
    16     {
    17         err_sys("creat error for bar");
    18     }
    19 
    20     exit(0);
    21 }
    View Code

     函数chmod, fchmod和fchmodat:

    1. chmod, fchmod和fchmodat用于更改文件的访问权限;
    2. chmod实例函数:
     1 #include "apue.h"
     2 
     3 int main(void)
     4 {
     5     struct stat statbuf;
     6 
     7     if (stat("foo", &statbuf) < 0)
     8     {
     9         err_sys("stat error for foo");
    10     }
    11 
    12     if (chmod("foo", (statbuf.st_mode & ~S_IXGRP | S_ISGID)) < 0)
    13     {
    14         err_sys("chmod error for foo");
    15     }
    16 
    17     if (chmod("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0)
    18     {
    19         err_sys("chmod error for bar");
    20     }
    21 
    22     exit(0);
    23 }
    View Code

     函数chown,fchown,fchownat和lchown:

    1. chown, fchown, fchownat和lchown函数用于更改文件的用户ID和组ID,如果owner或group中的任意一个为-1,对应ID不变;
  • 相关阅读:
    关于document.referrer的使用需要注意
    Vue2.0表单校验组件vee-validate的使用
    Ubuntu 20.04 Docker 安装并配置
    换硬盘,装win10系统小记
    关于MongoDB ObjectId的那些事儿
    水平垂直居中常见解决方案
    JSON基础知识总结
    css选择器中:first-child与:first-of-type的区别
    基于jQuery选择器的整理集合
    DOM对象与jquery对象有什么不同
  • 原文地址:https://www.cnblogs.com/skycore/p/4106674.html
Copyright © 2011-2022 走看看