Unix環境高階程式設計第一章摘記

2021-04-12 22:52:40 字數 3495 閱讀 6551

概述簡介全書的描述物件:unix下的系統呼叫介面和標準c庫提供的許多函式。相當於unix程式設計師手冊的第二和第三部分。

系統呼叫介面:作業系統給執行的程式提供的服務。

unix標準

ansi c,ieee posix,x/open portability guide(xpg)

全書組織

關於教程中的範例

1)解壓縮源**

$ gunzip src.tar.gz

$ tar xvf src.tar

2)在apue.2e目錄下修改make.defines.freebsd

wkdir=/home/dog/workspace/apue.2e

3)make

在./lib/下生成libapue.a庫檔案

4)execute fig1.3        ###fig1.3的功能是列出命令列引數argv[1]下的檔案。

$ cp include/apue.h .

$ cp fig1.3 run.c

$ gcc run.c lib/libapue.a

$./a.out ..

ch1概覽

簡介本章對以後將會碰到的概念和術語做了乙個扼要的描述。從乙個程式設計師的角度,對unix做了乙個快速瀏覽(a whirlwind tour)。

unix 結構

由內而外依次是 核心==>系統呼叫==>庫函式和shell==>應用程式(它也可以直接呼叫sc) 登入

系統口令檔案/etc/passwd,格式

登入名:加密形式的密碼:使用者數字id:組數字id:說明域:主目錄:shell程式

注:加密形式的密碼現在都放到了其它的乙個shadow檔案中,如freebsd是在/etc/master.passwd

shell是乙個命令解釋程式,接受來自終端(互動性shell)或檔案(shell指令碼)的命令。(shell程式設計可以閱讀《unix® shell programming, third edition》)

檔案和目錄

用stat和fstat檢視檔案的屬性資訊,屬性資訊用乙個結構表示。

檔名中不能出現兩個字元:null字元和/。

在建立目錄時,自動生成兩個檔案.和..。

全書的第乙個例程是列出argv[1]下的所有檔名,包括子目錄下的,

標頭檔案定義了struct dirent。opendir()返回乙個dir結構指標,將該指標傳遞給readdir(),返回dirent結構或者null。closedir()

當前工作目錄,主目錄

輸入和輸出

檔案描述符是核心用來標識正在被某個程序使用的檔案的非負小整數(注:unix將外設同樣看作是檔案)(相當於windows程式設計中的handle,控制代碼)。

標準輸入,標準輸出,標準錯誤

非緩衝輸入輸出和緩衝輸入輸出:看buffer是系統提供還是由使用者自己提供。

unistd.h posix標準 stdin_fileno,stdout_fileno

read(),write(),open(),close(),lseek()

stdio.h stdin,stdout,stderr

getc(),putc(),fgets(),ferror()

程式和程序

getpid(), 取得當前程序號。(如果想通過程序名獲取程序號,可以用乙個自定義函式,遍歷某個目錄,當前的程序名都出現在裡面,好像系統沒有提供。)

程序控制

fork(),exec(),waitpid()

execlp(const char *cmd,char *msg...) //從path中查詢符合引數cmd的檔名,找到後執行它。

父程序 子程序

執行緒和執行緒id

同一程序內的所有執行緒共享相同的程序位址空間,檔案描述符,棧以及與程序相關的屬性。執行緒間需要同步訪問共享資料以避免資料的不一致(inconsistencies)。

在程序內,執行緒由執行緒id唯一標識。注意:執行緒id只在其所在的程序內有效,到其他程序便無意義。

標準c特徵

函式原型,通用指標(void*),基本系統資料型別(primitive system data types)(通常定義在sys/types.h)

錯誤處理

系統函式呼叫時,往往返回乙個負數表示錯誤,通常用errno這個變數的值表示額外的資訊。

error.h定義了各種錯誤碼,e開頭。可以用man 3 errno檢視。

關於errno的兩條原則:

1)如果沒有錯誤發生,其值永遠不會被程式清除;

2)任何函式都不能將errno的值設為0。

相關的兩個函式

char *strerror(int errnum)    //errnum對映到錯誤描述資訊

void *perror(const char *msg)    //根據當前的errno值,在標準錯誤產生一條錯誤資訊

錯誤恢復

errno.h中的錯誤可分為兩類:致命的(fatal)和非致命的(nonfatal)。對於fatal的錯誤,我們無能為力,所能做的就是在使用者螢幕或日誌檔案輸出一條錯誤資訊。對於nonfatal的錯誤,很可能是因為暫時得不到共享資源而引起的,也就是說延遲執行可能不產生錯誤。

使用者標誌符

核心通過使用者id來檢查執行操作的許可權。超級使用者的id是0。如果乙個程序擁有超級使用者許可權,那麼絕大多數的檔案許可權檢查將被略過。

使用者習慣用字串的形式表示使用者和群組,但是對於系統來說,使用數字形式的id,效率更高。兩者之間的對映通過/etc/passwd這個檔案。補充群組標誌符(supplementary group ids ):允許乙個使用者最多屬於16個額外群組。

getuid(),getgid()

訊號訊號是向程序通知某條件發生的一種技術。

程序處理訊號的三種選擇:

1.忽略該訊號;

2.採取預設動作;

3.提供乙個函式,捕捉該訊號。

,signal(sig***,fun)

unix時間

日曆事件 since 00:00:00,january 1,1970.time_t

程序時間 也叫cpu時間,是**處理器用於程序處理的時鐘數。clock_t

unix對於每個程序維護三個時間值:

1)時鐘時間,程序執行花費的總時間

2)使用者cpu時間,用於執行使用者指令的cpu時間

3)系統cpu時間,程序切換到核心執行的cpu時間

用time命令可以輸出某個程序的這三個時間值。

系統呼叫和庫函式

小結from 2nd edtion

unix核心結構

圖中可以看出系統呼叫是核心的唯一對外介面,也就是說我們必須通過系統呼叫,才能使用核心提供的服務。在系統呼叫的基礎上,又構建了乙個通用函式庫。shell是乙個特殊的程式,為執行其他應用程式提供了乙個介面。

UNIX環境高階程式設計習題 第一章

1.1在系統上驗證,除了根目錄外,目錄.和.是不同的 2.分析圖1 6程式的輸出,說明程序id為852和853的程序發生了什麼情況 include apue.h int main void a.out hello world from process id 851 a.out hello world...

UNIX環境高階程式設計 3 第一章

所有作業系統都為他們所執行的程式提供服務。典型的服務包括 執行新程式 開啟檔案 讀檔案 分配儲存區以及獲取當前時間等。層級從裡向外擴充套件應用。1.核心 可將作業系統定義為一種軟體,即稱為核心,它控制計算機硬體資源,提供程式執行環境。2.系統呼叫 核心提供的介面。可被應用程式呼叫。3.shell 是...

《UNIX環境高階程式設計》第一章總結

第一章 unix 技術知識 unix的口令檔案一般情況下是 etc passwd檔案 口令檔案中的登入項一般有7個以冒號進行分割的字段組成 登入名,加密扣了,數字使用者id 224 數字組id 20 注釋字段,起始目錄 比如 home rollen 以及shell程式 bin ksh unix目錄的...