一 基礎知識
整個unix體系結構包括這麼幾個部分:
1 登入:
系統的口令檔案存放在/etc/passwd下面,每行是一條記錄。每條記錄以:分隔包含7個字段
但是現在所有的系統都將這些資訊放在其他檔案(which file).linux預設是bourne-again shell(bash).
2 檔案和目錄
目錄的起點為根,名字是/.目錄是包含多個目錄項的檔案,邏輯上來說目錄包含檔名還包括檔案 屬性資訊等,但是在現實系統實現時候屬性資訊是和檔案關聯起來的而不是由目錄儲存的。如果由 目錄來儲存檔案屬性資訊的話,那麼在製作硬鏈結的時候會存在問題,很難保持多個檔案屬性複本的同步。 建立目錄的時候自動會建立.和..目錄。
每個程序都存在工作目錄(working directory),使得所有相對路徑名都從這個工作目錄開始解釋。程序 允許使用chdir或者是fchdir來改變工作目錄。需要注意的是工作目錄僅僅和程序相關的,所以執行 乙個程式在裡面chdir,而退回到shell的話工作目錄不變。乙個使用者登入時候的工作目錄成為 起始目錄(home directory),這個在口令檔案中指定了。
目錄中各項就是檔名。通常來說檔名不能夠出現的字元只是/和null字元。儘管如此,乙個好的習慣是 應該盡可能使用印刷字元的乙個子集來作為檔名字元,這樣在shell下面能夠鍵入檔名。檔名 和目錄放在一起形成了路徑名(pathname).
檔案屬性包括檔案型別,檔案大小,檔案所有者,檔案許可權,檔案最後修改時間等。使用stat,fstat或者是lstat函式可以返回某個檔案的屬性資訊。
3 輸入和輸出
對於程序需要訪問檔案的話,系統呼叫提供的介面是檔案描述符(file descriptor).乙個fd是乙個小的非負 整數,核心用它標識乙個特定程序正在訪問的檔案。對於每乙個應用程式,shell都會為這個應用程式開啟 預設的3個fd,分別是stdin,stdout和stderr.這3個fd的值通常是0,1,2,但是為了程式的可移植性考慮的話, 最好使用
#include #define stdin_fileno 0io分為不帶緩衝io和帶緩衝io.不帶緩衝io是指read/write這樣的呼叫,而帶緩衝io是指標準io比如printf/ getchar/fputs這樣的呼叫。是否帶緩衝的區別是是否在使用者態是否有buffer來緩衝從核心態讀出來的資料。#define stdout_fileno 1
#define stderr_fileno 2
4 程式和程序
程式和程序的區別是邏輯上的區別。程式是靜態的儲存在磁碟的可執行檔案,使用者啟動程式的話,那麼 核心裝載這個程式執行,那麼就形成了程序。程序(process)就是程式執行之後的動態的乙個物件。
為了控制程序,每個程序都會分配乙個pid(process id).主要有3個用於控制程序的函式,分別是fork/exec/waitpid.需要注意的是,fork在很多系統中有另外乙個名字spawn.
fork()----建立程序
exec()-------
說是exec系統呼叫,實際上在linux中,並不存在乙個exec()的函式形式,exec指的是一組函式,一共有6個,分 別是:
#include
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp);
int execv(const char *path, char *const argv);
int execvp(const char *file, char *const argv);
int execve(const char *path, char *const argv, char *const envp);
其中只有execve是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。
waitpid()-------會暫時停止目前程序的執行,直到有訊號來到或子程序 結束。
程序是競爭作業系統的資源單位和排程單位,而執行緒是最小的排程單位。乙個程序可能包含很多執行緒(thread), 但是始終只有乙個主線程(main thread).使用執行緒可以充分利用多處理器系統的並行性。在同乙個程序裡面, 執行緒之間是共享資源的,包括位址空間,檔案描述符,棧,程序相關屬性等,而不像程序之間一樣預設資源是隔離 的(當然也可以共享).同時執行緒為了方便控制也有tid(thread id),但是控制線程的函式另外有一套。
5 錯誤處理:
當unix函式出錯時,常常返回乙個負值並且使用errno來表示這個錯誤號。
#include //是否支援多執行緒沒有支援多執行緒之前,可以使用變數來表示。但是如果是支援多執行緒的話,那麼errno將會是乙個全域性變數, 所以errno就需要後面一種方式表示。因為現在大部分作業系統都是支援多執行緒的,所以對於我們來說, 需要認識到errno其實是乙個巨集。#ifdef support_multi_threads
extern int errno;
#else
exrern int* __errno_locaiton(void);
#define errno (*__errno_locaiton())
#endif
//錯誤編號(!0)
#define eaccess <???>
#define eperm <???>
同時c標準定義了兩個函式來幫助列印錯誤資訊
const char* strerror(int errnum); //根據錯誤號返回乙個錯誤資訊字串void perror(const char* msg); //msg:《錯誤訊息》列印到標準錯誤上
6 使用者標識:
使用者標識包括
對於uid來說是系統為了簡化區別使用者的方式(不然使用字串區別非常麻煩).uid在登入時候確定 並且不能夠修改。uid=0的使用者為根使用者(root),這是乙個超級使用者對於系統都一切支配權。同理也是gid和sgid存在的理由。gid就好比使用者所屬部門的乙個編號,而sgid引入原因是有時候希望這個使用者 屬於多個其他部門,這些其他部門的gid就是sgid.
todo(zhangyan04):對於附加組id並不是很了解,而且覺得沒有必要去了解。關於附加組id主要包括下面 這些問題,包括附加組id在檔案許可權檢查作用,對應系統資料什麼檔案這些。
7 訊號
訊號(signal)是通知程序已經發生某種情況的一種技術。通常使用者接收到資訊有三個選擇:
在終端下面有兩種產生訊號的方式,分別是中斷鍵(interrupt key,c-c)和退出鍵(quit key,c-\).另外我們可以呼叫kill函式或者是在shell下面使用kill命令來給程序傳送訊號。
長期以來,unix系統使用兩種不同的時間值。
一種是自1970-1-1 0:0:0以來所經過的秒數累計值,使用timet來表示,可以用於比如儲存檔案最後一次
修改時間等。這是乙個絕對時間。
一種是cpu時間,用於度量程序使用的**處理機資源。cpu時間以時鐘滴答計算,使用sysconf可以獲得每秒 時鐘滴答數。使用clockt來表示。這是乙個相對時間。度量乙個程序的執行時間,unix使用三個時間值:
#include #include #include #include #include int main()//operations.
//...
struct tms buf;
if(times(&buf)==-1)
printf("user time:%.3lfs\n"
"sys time:%.3lfs\n"
"cuser time:%.3lfs\n"
"csys time:%.3lfs\n",
buf.tms_utime*1.0/clock_tck_per_sec,
buf.tms_stime*1.0/clock_tck_per_sec,
buf.tms_cutime*1.0/clock_tck_per_sec,
buf.tms_cstime*1.0/clock_tck_per_sec);
return 0;
9 系統呼叫和庫函式
系統呼叫是核心態函式,而庫函式是使用者態函式。
但是對於使用者來說實際上是不關心的。reaserch unix提供了50個系統呼叫,bsd4.4提供了110個,svr4提供了120個,linux提供了240-260個, 而freebsd大約提供了320個。通常來說在man 2裡面有描述。而庫函式在man 3裡面有描述。系統呼叫和 庫函式另外乙個差別是,系統呼叫通常提供乙個最小介面。
(但是現在趨勢是盡可能將很多功能集中形成 乙個系統呼叫,因為這樣不用頻繁地陷入核心態來提高效能),而庫函式在上層進行一些複雜功能實現。
linux學習筆記一
gnu general public license 奇數發展中版本,偶數穩定版本 linux的兩種操作方式 圖形介面 x windows system 僅是linux上的一套軟體 文字介面 command line 網路伺服器 www,mail server,file server,ftp ser...
Linux學習筆記(一)
一 磁碟分割槽 第一步 檔案系統型別 ext3 掛載點 固定大小 10000mb 第二步 檔案系統型別 ext3 掛載點 boot 強制為主分割槽 100mb 第三步 檔案系統型別 swap 固定大小 1000mb 第四步 檔案系統型別 ext3 掛載點 home 固定大小 5000mb 二 圖形介...
Linux學習筆記(一)
最後三個月,開始學習linux服務端,每天一篇筆記,記錄每日所得。今天週末,在機房自學了vim跟shell,距離11月15還有90天,加油!vim指令 進入插入模式 a在游標之前插入 a在句首插入 i在游標之後插入 i在句尾插入 o在下一行插入 o在上一行插入 esc返回命令模式 定位命令 set ...