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失败。

  • 相关阅读:
    C# 以GZip解压缩
    C# 获取时间戳(支持毫秒)
    C#中 DateTime 转 DateTimeOffset
    C# WPF中 SecureString 转 String
    C# 根据文件头判断文件类型
    C#中 MD5 32位加密
    C#中 Stream转为byte[]
    C#中byte[]转BitmapImage
    sql按天分组
    eclispe报错PermGen space
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/4064605.html
Copyright © 2011-2022 走看看