zoukankan      html  css  js  c++  java
  • 《APUE》第四章笔记(2)

    下面介绍对stat结构的各个成员的操作函数。

    先贴个stat结构的图:



    access函数:

    #include <unistd.h>

    int access(const char *pathname, int mode);

    其中,mode是表中的按位或。


    返回值:若成功返回0,若出错返回-1

    当进程对一个文件进行某种操作(读或写或执行)时,内核会以进程的有效用户ID和有效组ID为基础执行其访问权限测试。有时,进程也希望按其实际用户ID和实际组ID来测试其访问能力。例如当一个进程有使用设置用户ID或设置组ID时(通常此时有效用户ID并不等于实际用户ID),就可能会有这种需要。access函数是按实际用户ID和实际组ID来进行访问权限测试的。

    该测试分为四步:

    1.先看是不是超级用户,是的话就允许访问,不用看接下来的3步了。

    2.若进程的实际用户等于文件的所有者ID(也就是进程拥有该文件),那么就会按设置好的访问权限来访问。

    3.如果不符合2的话,那就看组,看是不是组的所有者。

    4.都不是的话那就依照other的访问权限来访问了。

    总接下来就是先看是否超级用户,再分别看user,group和other的访问权限。


    umask函数: 

    #include <sys/stat.h>

    mode_t umask(mode_t cmask);

    返回值:以前的文件模式创建屏蔽字

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

    在使用open和creat函数来创建一个新文件时,这两个函数都有一个参数mode,它指定了新文件的访问权限位。用umask可以屏蔽掉相应的权限。下面给个例子:


    首先umask(0)代表什么都不屏蔽。然后创建foo文件的权限是rw-rw-rw-。然后屏蔽掉组的读(S_IRGRP)和组的写(S_IWGRP)和其他的读(S_IROTH)和写(S_IWOTH)。然后当创建bar文件的时候,虽然指定了rw-rw-rw的权限,但是由于组的读写和其他的都写权限都被屏蔽掉了,所以不能显示。结果如下:


    除了向上述那样用宏来指定屏蔽字以外,还可以用向对应的数字。


    chmod和fchmod函数:

    #include <sys/stat.h>

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

    int fchmod(int fiedes, mode_t mode);

    两个函数返回值:若成功返回0,出错返回-1

    这两个函数使我们可以更改现有文件的访问权限。chmod函数在指定的文件上进行操作,而fchmod函数则对已打开的文件进行操作。

    为了改变一个文件的权限位,进程的有效用户ID必须等于文件的所有者ID,或者该进程必须具有超级用具权限。

    参数mode是下图所示常量的或运算构成的。



    chown,fchown和lchown函数:

    下面的几个函数可用于更改文件的用户ID和组ID。

    #include <unistd.h>

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

    int fchown(int filedes, uid_t owner, gid_t group);

    int lchown(const char *pathname, uid_t owner, gid_t group);

    三个函数的返回值:成功返回0,出错返回-1

    如果在符号链接的情况下,lchown更改的是链接本身的所有者,而不是符号链接所指向的文件。

    如果两个参数owner或者group中的任意一个是-1,则对应的ID不变。

    在linux下,能改的文件只有超级用户和进程的有效ID等于文件的所有者。


    文件长度:

    stat结构成员st_size表示以字节为单位的文件长度。此字段只对普通文件、目录文件和符号链接有意义。

    对于符号链接,文件长度是文件名中的实际字节数。(不包括'')


    文件截短:

    有两个函数可以实现。

    #include <unistd.h>

    int truncate(const char *pathname, off_t length);

    int ftruncate(int filedes, off_t length);

    两个函数的返回值:成功返回0,出错返回-1


    第四篇笔记待续。



  • 相关阅读:
    xml转换为json格式时,如何将指定节点转换成数组 Json.NET
    快速删除C#代码中的空白行
    C#编程中的Image/Bitmap与base64的转换及 Base-64 字符数组或字符串的长度无效问题 解决
    Flash设置(各种版本浏览器包括低版本IE)
    使用vcastr22.swf做flash版网页视频播放器
    使用VLC Activex插件做网页版视频播放器
    web项目 在visual studio 输出窗口显示调试信息
    geos 3.6.3库windows版本 已编译完成的32位版本和64位版本
    vs2017 打开附带的localdb v13
    visual studio code 里调试运行 Python代码
  • 原文地址:https://www.cnblogs.com/fusae-blog/p/4256790.html
Copyright © 2011-2022 走看看