3.15、函數ioctl
1、函數原型:插入圖片
3.16、/dev/fd:重要章節
1、較新的系統都提供名為/dev/fd的目錄,其目錄項是名為0、1/2等的文件,打開文件/dev/fd/n等效於複製描述符n(假定描述符n是打開的)。
2、linux實現中的/dev/fd是個例外。它把文件描述符映射成指向頂底層物理文件的符號鏈接。例如,當打開/dev/fd/0時,事實上正在打開與標準輸入關聯的文件,因此返回的新文件描述符的模式與/dev/fd文件描述符的模式其實並不相關。
3、某些系統提供路徑名/dev/stdin、/dev/stdout和/dev/stderr,這些等效於/dev/fd/0、/dev/fd/1和/dev/fd/2。
4、-:作為命令行參數的“-”特指標準輸入或標準輸出。
第4章:文件和目錄
4.1、引言
4.2、函數stat、fstat、fstatat和lstat
1、函數原型:插入圖片
4.3、文件類型:重要章節
4.4、設置用户ID和設置組ID:重要章節
1、實際用户id、實際用户組id,有效用户id、有效用户組id,保存的設置用户id、保存的設置組id的實際含義及區別
(1)
實際用户id、實際用户組id:標識我是誰。也就是登錄用户的uid和gid,比如我的Linux以zxf登錄,在Linux運行的所有的命令的實際用户ID都是zxf的uid,實際用户組ID都是zxf的gid(可以用id命令查看)。
有效用户id、有效用户組id:進程用來決定我們對資源的訪問權限。一般情況下,有效用户ID等於實際用户ID,有效用户組ID等於實際用户組ID。當設置-用户-ID(SUID)位設置,則有效用户ID等於文件的所有者的uid,而不是實際用户ID;同樣,如果設置了設置-用户組-ID(SGID)位,則有效用户組ID等於文件所有者的gid,而不是實際用户組ID。
4.5、文件訪問權限:
1、目錄文件讀、寫和執行權限的含義
(1)目錄文件的讀權限和執行權限:當我們用名字打開任一類型的文件時,對該名字中包含的每一個目錄,包括它可能的隱含的當前工作目錄都應具有執行權限,。這就是為什麼對於目錄其執行權限位常被稱為搜索位的原因。注意,對於目錄的讀權限和執行權限的意義是不同的。讀權限允許我們讀目錄,獲得在該目錄中所有文件名的列表。當一個目錄是我們要訪問文件的路徑名的一個組成部分時,對該目錄的執行權限使我們可通過該目錄(也就是搜索該目錄,尋找一個特定的文件名)。
(2)為了在一個目錄中創建一個新文件,必須對該目錄具有寫權限和執行權限。
(3)為了刪除一個現有文件,必須對包含該文件的目錄具有寫權限和執行權限。對該文件本身則不需要有讀、寫權限。
4.6、新文件和目錄的所有權
1、新文件的所有權
(1)新文件的用户ID:新文件的用户ID設置為進程的有效用户ID。
(2)新文件的組ID:關於組ID,POSIX.1允許實現選擇下列之一作為新文件的組ID
A:新文件的組ID可以是進程的有效組ID。
B:新文件的組ID可以是它所在目錄的組ID
注意:對於linux,默認情況下,新文件的組ID取決於它所在的目錄的設置組ID位是否有被設置,如果該目錄的這一位已經被設置,則新文件的組ID設置為目錄的組ID,否則新文件的組ID設置為進程的有效組ID。
4.7、函數access和faccessat
1、access和faccessat函數是按實際用户ID和實際組ID進行訪問權限測試的。
2、函數原型,插入圖片
4.8、函數umask
1、函數原型,插入圖片
4.9、函數chmod、fchmod和fchmodat
1、函數原型,插入圖片
2、為了改變一個文件的權限位,進程的有效用户ID必須等於文件的所有者ID,或者該進程必須就有超級用户權限。
3、chmod函數更新的只是i節點最近一次被更改的時間。按系統默認方式,ls -l列出的是最後修改文件內容的時間。
4、chmod函數在下列條件下自動清除兩個權限位:
(1)Solaris等系統對用於普通文件的粘着位賦予了特殊含義,在這些系統上如果我們試圖設置普通文件的粘着位(S_ISVTX)。而且又沒有超級用户權限,那麼mode中的粘着位自動被關閉。這意味着只有超級用户才能設置普通文件的粘着位。這樣做的理由是防止惡意用户設置粘着位,由此影響系統性能。
注意對於linux系統並無此種限制(並不限制只有超級用户才能設置普通文件的粘着位,當進程的有效用户ID等於文件的所有者ID時,也可以設置粘着位),其原因是,粘着位對linux普通文件並無意義。
4.10、粘着位
1、S_ISVTX位被稱為粘着位。如果一個可執行程序文件的這一位被設置了,那麼當該程序第一次被執行時,在其終止時,程序正文部分的一個副本仍被保存在交換區(程序的正文部分是機器指令)。這使得下次執行該程序時能較快地將其裝載入內存。
2、後來的UNIX版本稱它為保存正文位,因此也就有了常量S_ISVTX。現今較新的UNIX系統大多都配置了虛擬存儲系統以及快速文件系統,所以不再需要使用這種技術。現今的系統擴展了粘着位的使用範圍,Single UNIX Specification允許針對目錄設置粘着位,如果對一個目錄設置了粘着位,只有對該目錄具有寫權限的用户並且滿足下列條件之一,才能刪除或重命名該目錄下的文件:
(1)擁有此文件
(2)擁有此目錄
(3)是超級用户
4.11、函數chown、fchown、fchownat和lchown
1、下面幾個chown函數可用於更改文件的用ID和組ID。如果兩個參數owner或group中的任意一個是-1,則對應的ID不便。插入圖片。
2、給予BSD的系統一直規定只有超級用户才能更改一個文件的所有者,這樣做的原因是防止用户改變其文件的所有者從而擺脱磁盤空間限額對他們的限制。System V則允許任一用户更改他們擁有文件的所有者。按照_POSXI_CHOWN_RESTRICTED的值,POSIX.1允許在這兩種形式的操作中選用一種。對於Solaris 10,此功能是個配置選項,其默認值是施加限制。而FreeBSD 8.0、Linux 3.2.0和Mac OS X 10.6.8則總對chown施加限制。
3、若_POSXI_CHOWN_RESTRICTED對指定的文件生效,則
(1)只有超級用户進程能更改該文件的用户ID
(2)如果進程擁有此文件(其有效用户ID等於該文件的用户ID),參數owner等於-1或文件的用户ID,並且參數group等於進程的有效組ID或進程的附屬組ID之一,那麼一個非超級用户進程可以更改該文件的組ID。
這意味着,當_POSIX_CHOWN_RESTRICTED有效時,不能更改其他用户文件的用户ID。你可以更改你所有用的文件的組ID,但是隻能改到你所屬的組。如果這些函數由非超級用户進程調用,則在成功返回時,該文件的設置用户ID位和設置組ID位都被清除。
4.12、文件長度
1、stat結構成員st_size表示以字節為單位的文件長度。此字段只對普通文件、目錄文件和符號鏈接有意義。
(1)對於普通文件,其文件長度可以是0,在開始讀這種文件時,將得到文件結束(end-of-file)指示
(2)對於目錄,文件長度通常是一個數(如16或512)的整數倍。
(3)對於符號鏈接,文件長度指的是被鏈接文件的文件名實際字節數。注意,因為符號鏈接文件長度總是由st_size指示,所以它並不包含通常C語言用作名字結尾的null字節。
(4)現在,大多數現代的UNIX系統提供字段st_blksize和st_blocks。其中,第一個是對文件I/O比較合適的塊長度,第二個是所分配的實際512字節塊數。
2、du命令:在很多BSD類系統上,du命令報告的是1024字節塊的塊數,Solaris報告的是512字節塊的塊數。在linux上,報告的塊數單位取決於是否設置了環境變量POSIXLY_CORRECT。當設置了該環境變量,du命令報告的是1024字節塊的塊數;沒有設置該環境變量,du命令報告的是512字節塊的塊數。
(1)參考網址:
3、帶-c選項的wc(1)命令計算文件中的字符數(字節)。
4.13、文件截斷
1、函數原型。插入圖片
2、這兩個函數將一個現有文件長度截斷為length。如果該文件以前的長度大於length,則超過length以外的數據就不再能訪問了。如果以前的長度小於length,文件長度將增加,在以前的文件尾端和新的文件尾端之前的數據將讀作0(也就是可能在文件中創建一個空洞)