系統呼叫:核心的介面;
公用函式庫:構建在系統呼叫介面之上;
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裝置驅動來完成硬體裝置間的互...