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

2021-08-28 04:35:40 字數 4488 閱讀 1867

所有作業系統都為他們所執行的程式提供服務。典型的服務包括:執行新程式、開啟檔案、讀檔案、分配儲存區以及獲取當前時間等。

層級從裡向外擴充套件應用。

1. 核心:可將作業系統定義為一種軟體,即稱為核心,它控制計算機硬體資源,提供程式執行環境。

2. 系統呼叫:核心提供的介面。可被應用程式呼叫。

3. shell:是乙個特殊的應用程式,為執行其他應用程式提供乙個介面。

4. 應用程式。

1, 登入名

使用者在登入unix系統時,先鍵入登入名,然後鍵入口令。系統在其口令檔案(通常是/etc/passwd檔案)中檢視使用者名稱。

2, shell

使用者登入後,系統通常先顯示一些系統資訊,然後使用者就可以向shell程式鍵入命令。

shell是乙個命令列直譯器,它讀取使用者輸入,然後執行命令。

目錄是乙個包含目錄項的檔案,可以認為每個目錄項都包含乙個檔名,同時還包含該檔案屬性的資訊(ls -l可以檢視)。第四章會詳細說明檔案的各種屬性。

1, 檔案系統

unix檔案系統是目錄和檔案的一種層次結構,所有東西的起點都是根的目錄,這個目錄名稱是乙個字元「/」。

2, 檔名

目錄中的各個名字成為檔名,建立目錄時會自動建立兩個檔名:.(當前目錄)和..(父目錄) (可見為什麼 cd .. 會回到父目錄)

3, 路徑名

已斜線開頭的路徑名稱成為絕對路徑名(可以理解為以根目錄開頭的相對路徑名),否則為相對路徑名。

用系統庫函式可列出乙個目錄中所有檔案的名字,下面是ls命令的簡要實現。

#include "apue.h"

#include

int main(int argc,char *argv)

(1)系統標頭檔案dirent.h,以便使用opendir和readdir的函式原型,以及dirent結構的定義。

(2)opendir()函式返回指向dir結構的指標,我們將該指標傳送給readdir來讀每個目錄項。當目錄已無目錄項可讀時則返回null指標。

(3)函式exit終止程式,引數0為正常結束,引數值1~255表示出錯

4, 工作目錄

每個程序都有乙個工作目錄,有時稱其為當前工作目錄,程序可以用chdir函式更改其工作目錄

5, 起始目錄

登入時,工作目錄設定為起始目錄,該起始目錄從口令檔案中相應使用者的登入項中取得。

檔案描述符

檔案描述符通常是乙個小的非負整數,用來標識乙個特定程序正在訪問的檔案。當核心開啟乙個現有檔案或建立乙個新檔案時,它都返回乙個檔案描述符,可以通過這個檔案描述符進行讀寫檔案。

標準輸入、標準輸出和標準錯誤

每當執行乙個新程式時,所有的shell都為其開啟3個檔案描述符,即標準輸入(0)、標準輸出(1)和標準錯誤(2),如果不做特殊處理,則這3個描述符都鏈結到終端。

不帶緩衝的i/o

函式open、read、write、lseek以及close提供了不帶緩衝的i/o。這些函式都使用檔案描述符

下面程式展示了如何複製unix下的普通檔案

#include "apue.h"

#define buffsize 4096

int main(void)

大多數shell都提供一種方法,使其中任何乙個或所有這3個描述符都能重定向到某個檔案。例如ls > file.list可以將ls的輸出(標準輸出 檔案描述符為1)重定向到名為file.list的檔案。

如下執行上面的程式:./a.out > data可以把程式的標準輸出重定向到檔案data./a.out < infile > outfile把程式的標準輸入重定向到infile 把標準輸出重定向到outfile,實現了檔案的複製。

4, 標準i/o

標準i/o 為那些不帶緩衝的i/o函式提供了乙個帶緩衝的介面,下面演示使用標準i/o複製unix檔案

#include "apue.h"

int main(void)

1, 程式

程式是乙個儲存在磁碟上某個目錄中的可執行檔案

2, 程序和程序id

程式的執行例項被稱為程序,unix系統確保每個程序都有乙個唯一的數字識別符號,稱為程序id。程序id總是乙個非負整數.

下面程式用於列印程序id

#include "apue.h"

int main(void)

3, 程序控制

有3個用於程序控制的主要函式:fork、exec和waitpid。

unix系統的程序控制功能可以用乙個簡單得程式說明,下面程式從標準輸入讀取命令,然後執行命令,類似於shell程式的基本實施部分。

#include "apue.h"

#include

int main(void)

if((pid=waitpid(pid,&status,0))<0)

err_sys("waitpid error");

printf("%% ");

}exit(0);

}

4, 執行緒和執行緒id

與程序相同,執行緒也用id標識。但是,執行緒id只在它所屬的程序內起作用。

當unix系統函式出錯時,通常會返回乙個負值,而且整形變數errno通常被設定為具有特定資訊的值。

#include 

char *strerror(int errnum);

return:指向訊息字串的指標

strerror函式將errnm(通常就是error值)對映為乙個出錯訊息字串,並且返回此字串的指標。

#include 

void perror(const

char *msg);

perror函式基於errno的當前值,在標準錯誤上產生一條出錯資訊,然後返回。

下面程式顯示這兩個出錯函式的使用方法

#include "apue.h"

#include

int main(int argc,char *argv)

1, 使用者id

使用者id是乙個數值,用來確定乙個使用者。使用者id為0為根使用者或超級使用者,超級使用者對系統有自由的支配權。

2, 組id

組id是由系統管理員在指定使用者登入名時分配的,可以把多個使用者分成一組。

下面程式用於列印使用者id和組id

#include "apue.h"

int main(void)

3, 附屬組id

除了在口令檔案中對乙個登入名指定乙個組id之外,大多數unix系統版本還允許乙個使用者屬於另外一些組。

訊號用於通知程序發生了某種情況。例如,若某一程序執行除法操作,其除數為0,則將名為sigfpe(浮點異常)的訊號傳送給程序。

程序有以下3種處理訊號的方式:

忽略訊號

按系統預設方式處理

提供乙個函式,訊號發生時呼叫該函式,這被稱為捕捉該訊號。

終端鍵盤上有兩種產生訊號的方法,分別稱為中斷鍵(通常是delete或ctrl+c)和退出鍵(通常是ctrl+)

修改之前的shell例項,使程式可以捕獲sigint訊號,我們會在第10章詳細的介紹訊號。

#include "apue.h"

#include

static

void sig_int(int);

int main(void)

if((pid=waitpid(pid,&status,0))<0)

err_sys("waitpid error");

printf("%% ");

}exit(0);

}void sig_int(int signo)

歷史上,unix系統使用過兩種不同的時間值

日曆時間。該值是從2023年1月1日00:00:00這個特定時間以來所經過的秒數的累計值。

程序時間。也被稱為cpu時間

當度量乙個程序的執行時間時,unix系統為乙個程序維護了3個程序時間值

程序時間

說明時鐘時間

即程序執行的時間總量,其值與系統中同時執行的程序數有關

使用者cpu時間

執行使用者指令所用的時間量

系統cpu時間

執行系統呼叫的時間

linux不同版本提供了240——260個系統呼叫,應用程式可以呼叫庫函式或者系統呼叫,庫函式也可呼叫系統呼叫;系統呼叫提供了最小的介面,庫函式則提供比較複雜的功能。

系統呼叫提供的函式如open, close, read, write, ioctl等,系統呼叫發生在核心空間

標準c庫函式提供的檔案操作函式如fopen, fread, fwrite, fclose, fflush, fseek等屬於庫函式,底層也是通過系統呼叫來實現的

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

概述簡介全書的描述物件 unix下的系統呼叫介面和標準c庫提供的許多函式。相當於unix程式設計師手冊的第二和第三部分。系統呼叫介面 作業系統給執行的程式提供的服務。unix標準 ansi c,ieee posix,x open portability guide xpg 全書組織 關於教程中的範例...

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環境高階程式設計》第一章總結

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