《apue》讀書筆記 第一章 UNIX基礎知識

2021-07-08 09:58:47 字數 2708 閱讀 5392

系統呼叫:核心的介面;

公用函式庫:構建在系統呼叫介面之上;

shell:為執行其他應用程式提供了乙個介面。

unix作業系統的體系結構

系統是用數值id來表示使用者的,但為方便可讀性,id和使用者名稱之間存在一一對映。

系統口令檔案在/etc/passwd中,為保證密碼安全,加密口令轉移到另乙個檔案中了。

我們linux常用的bash,全名是bourne-again shell,是gnu shell,被設計成遵循posix的,支援c shell和korn shell兩者的特色功能。

(在linux中,/bin/sh將鏈結到/bin/bash)

檔名中不能出現斜線(/)和空操作符(null)。

斜線用來分隔構成路徑名的各檔名,空操作符用來終止乙個路徑名。

. 表示當前目錄;

.. 表示上一層目錄。

絕對路徑:以斜線開頭;

相對路徑:相對於當前目錄的路徑。

ls(1)命令的簡單實現:

/*

列出乙個目錄中的所有檔案

*/#include "apue.h"

#include

int

main(int argc, char *argv)

家目錄:登陸時的預設目錄,一般為/home/使用者名稱。

文字描述符是乙個小的非負整數,核心用以標識乙個特定程序正在訪問(讀或者寫)的檔案。當核心開啟乙個或建立乙個檔案時,它就返回乙個檔案描述符。然後當讀、寫檔案時,就可使用它。

一般,每當執行乙個新程式時,所有的shell都為其開啟三個檔案描述符:標準輸入、標準輸出以及標準錯誤。

函式open,read,write,lseek,close提供了不帶緩衝的i/o。

所謂不帶緩衝,就是告訴系統呼叫操作多少,那麼它就會盡量操作這些資料然後返回。

而對於帶緩衝的,一般會等到緩衝區滿了才進行操作。

提供了帶緩衝的介面。

程式:存放在磁碟上,可執行;

程序:例項化的程式,每個程序有唯一個數字識別符號,為程序id;

3個主要的程序控制函式:fork,exec和waitpid:

fork建立乙個新的子程序,是父程序的複製品,fork向父程序返回子程序id,向子程序返回0;

在子程序中,呼叫execlp執行新程式檔案,這就用新的程式檔案來替換了子程序原先執行的程式檔案,因此產生了乙個新的程序;

如果父程序希望等待子程序終止,則用waitpid。

我們可以使用getpid()來獲得程序id,它返回乙個pid_t資料型別,我們不知道它的大小,但是標準保證它能存放在乙個long int中。

從標準輸入讀入命令並執行(不能傳引數):

#include "apue.h"

#include

intmain(void)

else

if (pid == 0)

/* parent */

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

err_sys("waitpid error");

printf("%% ");

}exit(0);

}

一些個人的理解:我們使用bash 下達命令時,產生的新程序是bash的子程序。

當unix函式出錯時,往常返回乙個負值,同時將整型變數errno設定為具有特定資訊的乙個值。例如,open函式如成功執行則返回乙個非負檔案描述符,如出錯則返回-1,同時設定errno。在open出錯時,有大約15種不同的errno值(檔案不存在,許可權問題等)。

c標準定義了兩個函式來幫助列印錯誤資訊:

char *strerror(int errnum); //返回:指向訊息字串的指標

void perror(const char *msg); //輸出由msg指向的字串,然後是乙個冒號,乙個空格,接著是對應於errno值的出錯資訊,最後換行。

例子:

#include "apue.h"

#include

intmain(int argc, char *argv)

編譯送到a.out,執行和結果:

$ ./a.out

eacces: permission denied

./a.out: no such file

ordirectory

出錯分類:致命錯誤和非致命錯誤;

使用者id(/etc/passwd),組id(/etc/group),附加組id(乙個使用者可以屬於多個組)。

(用id來儲存,假設每個值用雙位元組整型值存放,則這兩個值只需要4個位元組)

訊號處理:

當向乙個程序發訊號時,我們需要是該程序的擁有者或者超級使用者。

時鐘時間, 使用者cpu時間, 系統cpu時間。

應用程式**——系統呼叫 or

應用程式**——c庫函式 or

應用程式**——c庫函式——系統呼叫;

例子: 應用程式——malloc分配記憶體——sbrk系統呼叫。

系統呼叫通常提供乙個最小介面,函式通常實現比較複雜的功能。

(unix中,每個系統呼叫在標準c庫中設定乙個具有相同名字的函式,所以我們可以通過標準c庫來進行系統呼叫)

第一章讀書筆記

本章內容主要講的是android系統移植和驅動開發概述,通過本章的學習知道了學習linux驅動程式設計一定要了解linux驅動只與linux核心有關,與客戶的使用的linux系統無關。也就是說,不管是那個linux系統,只要使用了同樣的linux核心,驅動就可以通過。唯一可以判斷的linux核心是否...

第一章讀書筆記

android的系統架構分為4層 第一層 linux核心。第二層 c c 庫。第三層 android。第四層 應用程式。android移植可兩個部分 應用移植和系統移植。目前linux核心主要維護3個版本 linux2.4,linux2.6和linux3.x,大多數linux系統都使用了這3個版本的...

第一章讀書筆記

若給android增加新的驅動,則hal也要做出相應修改。不同的linux版本的驅動程式並無法通用,那麼通過判斷linux核心版本號是否相同,可以檢驗驅動是否可以通用。目前最廣泛的核心版本應該是linux2.6。電腦或者手機等不同硬體裝置越來越豐富,則需要更多的linux裝置驅動來完成硬體裝置間的互...