apue第四章學習總結

apue第四章學習總結

4.1.若以stat函數去替換lstat函數,會發生:

原來的目錄路徑:shell

$:~/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

當執行程序時:bash

$:~/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.驗證關閉你所建立的一個文件的讀權限,看能不能訪問本身的文件文件

如圖:ui

$:~/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程序,發生什麼效果

咱們能夠看一下:spa

$ 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程序,使得複製時不把空洞文件複製過去

程序以下:code

#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!\n");
    }

    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,它是不會被釋放的,因此這時就能更改到所引用文件的狀態時間。it

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

相關文章
相關標籤/搜索