筆者將《unix環境高級編程》主要內容總結爲三篇:文件篇,進程篇,高級io和進程間通訊三大板塊。本文是unix環境高級編程系列文章第一篇:文件篇。該篇主要包括:node
介紹了unix的體系結構,以及unix中的文件和目錄,輸入輸出,程序和進程,信號等基本概念shell
標準包括C語言的標準和操做系統標準,實現包括BSD,FreeBSD,Linux,Solari,Mac os等數據庫
包括文件描述符,對文件的打開,關閉,定位,讀,寫,改變文件屬性操做。內核IO調用基於文件描述符。還介紹了文件的底層數據結構,瞭解數據結構以後就能理解文件是如何支持共享的編程
主要介紹文件的屬性和屬性對應的數據結構,以及各個字段控制的問訪問權限,文件類型等。unix中一切皆文件,這些文件包括:普通文件,目錄文件,塊特殊文件,字符特殊文件,FIFO,套接字和符號連接。最後結束UFS文件系統。數組
標準io解決了內核io的不少細節問題,包括緩衝區分配。全部操做基於流和File對象緩存
最後介紹系統提供的一些數據文件,包括口令文件,陰影文件,朱文傑,登陸帳號文件,服務數據文件,協議數據文件,網絡數據文件等bash
一般是一個小的非負整數,內核用它標識一個特定進程正在訪問的文件服務器
每當運行一個新程序時,shell都爲其打開三個文件描述符:網絡
說明 | 文件描述符 | 頭文件 | 宏 |
---|---|---|---|
標準輸入 | 0 | <unistd.h> | STDIN_FILENO |
標準輸出 | 1 | <unistd.h> | STDOUT_FILENO |
標準出錯 | 2 | <unistd.h> | STDERR_FILENO |
進程控制的主要函數:fork,exec和waitpid數據結構
unix系統一直使用兩種不一樣的時間值
open(pathname, O_WRONLY|O_CREATE|O_TRUNC, mode)
複製代碼
unix支持在不一樣進程間共享打開的文件,unix內核使用什麼數據結構來支持這種共享呢?
這幾個函數出現的背景:unix提供的延時寫功能,經過提供緩衝區以減小磁盤讀寫次數,可是下降了文件內容更新速度,這幾個函數用於保證緩衝區內容與文件內容的同步,保證一致性。
```
struct stat {
mode_t st_mode; //文件模式,包含文件類型,用戶id,組id,訪問權限(9種)等信息
ino_t st_ino; //inode節點號
dev_t st_dev; //設備號碼
dev_t st_rdev; //特殊設備號碼
nlink_t st_nlink; //文件的鏈接數
uid_t st_uid; //文件全部者
gid_t st_gid; //文件全部者對應的組
off_t st_size; //普通文件,對應的文件字節數
time_t st_atime; //文件數據最後被訪問的時間
time_t st_mtime; //文件數據最後被修改的時間
time_t st_ctime; //文件狀態(i節點狀態)的最後修改時間
blksize_t st_blksize; //文件內容對應的塊大小
blkcnt_t st_blocks; //偉建內容對應的塊數量
};
```
複製代碼
硬連接直接指向文件的i節點
符號連接是指向一個文件的間接指針。
標準io提供三種類型的緩衝
讀寫流有三種不一樣的方式
不帶f前綴的從標準輸入流讀取數據,帶f前綴的從指定流讀取數據。不帶f前綴的函數不推薦使用,由於它不指定緩衝區大小,會致使溢出。
定位標準io流有三種不一樣的方式