原來的目錄路徑: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函數是不會識別出符號連接的文件的。函數
過程和結果一目瞭然:學習
$:~/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: 權限不夠
如圖: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: 權限不夠
咱們能夠看一下: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是僅對當下進程產生或打開的文件產生做用,對於已經建立的文件,它們的權限位不會發生改變。指針
程序以下: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; }
當建立新的core文件時,內核對其訪問權限有一個默認設置,在本例中是rw-r--r--。這一默認值可能會也可能不會被umask的值修改。
shell對建立的重定向的新文件(core.copy)也有一個默認的訪問權限,本例中爲rw-rw-rw-,而且這個值老是被當前的umask修改,本例中umask爲02.進程
其實unlink的實質只是在對於所引用的文件的引用計數減1,若是引用計數沒有減爲0,它是不會被釋放的,因此這時就能更改到所引用文件的狀態時間。it
$:/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失敗。