zoukankan      html  css  js  c++  java
  • apue第四章学习总结

    apue第四章学习总结

    4.1.若以stat函数去替换lstat函数,会发生:

    原来的目录路径:

    $:~/workspace/apue2/include$ ls -l apue.h abc 
    lrwxrwxrwx 1 mikedeng mikedeng    6 10月 25 18:33 abc -> apue.h
    -rw-r--r-- 1 mikedeng mikedeng 4736  5月 28  2005 apue.h
    
    
    

    当执行程序时:

    $:~/workspace/apue2/include$ ./stat abc apue.h 
    ./stat: regular
    abc: regular
    apue.h: regular
    
    

    可见,使用stat函数是不会识别出符号链接的文件的。

    4.2.如果创建屏蔽字777

    过程和结果一目了然:

    $:~/workspace/apue2/include$ umask 002
    $:~/workspace/apue2/include$ umask
    0002
    $:~/workspace/apue2/include$ umask 777
    $:~/workspace/apue2/include$ touch a
    $:~/workspace/apue2/include$ ll
    总用量 64
    drwxr-xr-x  3 mikedeng mikedeng  4096 10月 25 18:55 ./
    drwxr-xr-x 32 mikedeng mikedeng  4096  5月 30  2005 ../
    ----------  1 mikedeng mikedeng     0 10月 25 18:55 a
    lrwxrwxrwx  1 mikedeng mikedeng     6 10月 25 18:33 abc -> apue.h
    -rw-r--r--  1 mikedeng mikedeng  4736  5月 28  2005 apue.h
    drwxrwxr-x  5 mikedeng mikedeng  4096 10月 20 17:28 dirls/
    -rw-r--r--  1 mikedeng mikedeng  2021 10月 20 17:57 error.c
    -rwxrwxr-x  1 mikedeng mikedeng 12142 10月 20 17:57 readerror*
    -rw-rw-r--  1 mikedeng mikedeng   804 10月 20 17:55 readerror.c
    -rwxrwxr-x  1 mikedeng mikedeng  7911 10月 25 18:42 stat*
    -rw-rw-r--  1 mikedeng mikedeng   860 10月 25 18:41 stat.c
    -rwxrwxr-x  1 mikedeng mikedeng  7236 10月 20 17:40 ugid*
    -rw-rw-r--  1 mikedeng mikedeng   105 10月 20 17:39 ugid.c
    $:~/workspace/apue2/include$ cat a
    cat: a: 权限不够
    

    4.3.验证关闭你所创建的一个文件的读权限,看能不能访问自己的文件文件

    如图:

    $:~/workspace/apue2/include$ cat a
    sddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsd
    $:~/workspace/apue2/include$ ls -l a
    -rw-rw-r-- 1 mikedeng mikedeng 109 10月 25 18:58 a
    $:~/workspace/apue2/include$ chmod 151 a
    $:~/workspace/apue2/include$ cat a
    cat: a: 权限不够
    

    4.4.创建foo和bar,在运行umask程序,发生什么效果

    我们可以看一下:

    $ touch foo
    $ touch bar
    $ ls -l foo bar 
    -rw-rw-r-- 1 mikedeng mikedeng 0 10月 25 19:08 bar
    -rw-rw-r-- 1 mikedeng mikedeng 0 10月 25 19:08 foo
    $ ./umask 
    $ ls -l foo bar 
    -rw-rw-r-- 1 mikedeng mikedeng 0 10月 25 19:09 bar
    -rw-rw-r-- 1 mikedeng mikedeng 0 10月 25 19:09 foo
    $ umask
    0002
    
    

    其实原因并不复杂,我们知道umask是仅对当下进程产生或打开的文件产生作用,对于已经创建的文件,它们的权限位不会发生改变。

    4.5.目录和符号链接诶的长度是否可以为0?

    • 对于目录,由于里面肯定包含.和..两个目录节点,所以长度肯定不为0;
    • 而对于符号链接,文件长度是文件名中的实际字节数。

    4.6.重写cp程序,使得复制时不把空洞文件复制过去

    程序如下:

    #include "apue.h"
    #include <fcntl.h>
    #include <unistd.h>
    
    #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
    int main(int argc,char* argv[]){
    
        int sourcefd,destfd;  //源文件描述符,目的文件描述符
        ssize_t nread;  //读取文件节点
        ssize_t nwrite; //写入文件节点
        char* buf;  //字符缓冲区
        int len = 1;  //一次读入的文件长度
        struct stat st; //文件性质结构体
    
        if(argc != 3){
            err_quit("usage: ./cp <source filename> <destination path>");
        }
    
        if((sourcefd = open(argv[1],O_RDONLY)) < 0){   //只读性质打开第一个文件
            err_quit("can't open source file.");
        }
    
        if((buf = (char*)malloc(len)) == NULL){  //为字符缓冲区开辟空间
            err_quit("can't malloc space.");
        }
    
        umask(0);
        if((destfd = creat(argv[2],RWRWRW)) < 0){
            err_quit("can't create destination file.");
        }
    
        while((nread = read(sourcefd,buf,len)) > 0){
            if(buf[0] != 0){
                if((nwrite = write(destfd,buf,nread)) < 0){
                    err_quit("Write Error.");
                }
            }
        }
    
        if(nread < 0){
            err_quit("Read Error!
    ");
        }
    
        free(buf);  //释放文件指针
        close(nread); //关闭文件读取进程
        close(nwrite); //关闭写入文件节点
        return  0;
    }
    

    4.7.可能是一些干货,问的是到底创建的文件与shell重定向的文件到底受不受umask的影响?

    当创建新的core文件时,内核对其访问权限有一个默认设置,在本例中是rw-r--r--。这一默认值可能会也可能不会被umask的值修改。
    shell对创建的重定向的新文件(core.copy)也有一个默认的访问权限,本例中为rw-rw-rw-,并且这个值总是被当前的umask修改,本例中umask为02.

    4.9.unlink是如何修改到引用文件的状态更改时间的?

    其实unlink的实质只是在对于所引用的文件的引用计数减1,如果引用计数没有减为0,它是不会被释放的,所以这时就能更改到所引用文件的状态时间。

    4.17.有些程序创建输出文件之前,先删除该文件以确保该文件名不存在。那如果是/dev/fd/1呢?

    $:/dev/fd$ ll
    总用量 0
    dr-x------ 2 mikedeng mikedeng  0 10月 25 17:52 ./
    dr-xr-xr-x 9 mikedeng mikedeng  0 10月 25 17:52 ../
    lrwx------ 1 mikedeng mikedeng 64 10月 25 17:52 0 -> /dev/pts/0
    lrwx------ 1 mikedeng mikedeng 64 10月 25 17:52 1 -> /dev/pts/0
    lrwx------ 1 mikedeng mikedeng 64 10月 25 17:52 2 -> /dev/pts/0
    lrwx------ 1 mikedeng mikedeng 64 10月 25 21:19 255 -> /dev/pts/0
    

    可见,/dev目录关闭了一般用户的写访问权限,以避免用户删除目录中的文件,这就意味着unlink失败。

  • 相关阅读:
    LeetCode Binary Tree Inorder Traversal
    LeetCode Populating Next Right Pointers in Each Node
    LeetCode Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode Reverse Linked List II
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Pascal's Triangle
    Palindrome Construct Binary Tree from Preorder and Inorder Traversal
    Pascal's Triangle II
    LeetCode Word Ladder
    LeetCode Binary Tree Zigzag Level Order Traversal
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/4064605.html
Copyright © 2011-2022 走看看