UNIX體系結構:
從嚴格意義上講,可將操做系統定義爲一種軟件,它控制計算機硬件資源,提供程序運行環境。咱們一般將這種軟件稱爲內核(Kernel),由於他相對較小,並且位於環境的核心。圖片顯示了UNIX系統的體系結構。
內核的接口被稱爲系統調用(system call)。公用函數庫構建在系統調用接口只是,應用程序便可使用公用函數庫,也可使用系統調用。shell是一個特殊的應用程序,爲運行其餘應用程序提供一個接口。shell
登陸:
系統口令文件一般是/etc/passwd。口令文件中的登陸項由7個以冒號分隔的字段組成,依次是:登陸名、加密口令、數字用戶ID、註釋字段、起始目錄(/home/sar)以及shell程序(/bin/ksh)。
目前,全部的系統已將加密口令移到另外一個文件中。
shell:
shell是一個命令行解釋器,它讀取用戶輸入,而後執行命令。函數
文件和目錄:ui
一、文件系統:
UNIX文件系統是目錄和文件的一種層次結構,全部東西的起點是稱爲根(root)的目錄,這個目錄的名稱是一個字符「/」。
目錄(directory)是一個包含目錄項的文件。在邏輯上,能夠認爲每一個目錄項都包含一個文件名。同時還包含說明該文件屬性的信息。文件屬性是指文件類型(是普通文件仍是目錄等)、文件大小、文件全部者、文件權限(其 它用戶可否訪問該文件)以及文件最後的修改時間等。stat和fstat函數返回包含全部文件屬性的一個信息結構。
注:
目錄項的邏輯視圖與時間存在磁盤上的方式是不一樣的。UNIX文件系統的大多數實現並不在目錄項中存放屬性,這是由於當一個文件具備多個硬連接時,很難保持多個屬性副本之間的同步。加密
二、文件名:
建立新目錄時會自動衝擊兩個文件名:.(稱爲點)和..(稱爲點點)。點指向當前目錄,點點指向父目錄。在最高層次的根目錄中,點點與點相同。spa
三、路徑名:
由斜線分隔的一個或多個文件名組成的序列(也能夠斜線開頭)構成路徑名(pathname),以斜線開頭的路徑名稱稱爲絕對路徑(absolute pathname),不然稱爲相對路徑名(relative pathname)。相對路徑名指向相對於當前 目錄的文件。文件系統根的名字是一個特殊的絕對路徑名,它不包含文件名。
#include "apue.h"
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;
操作系統
if (argc != 2) {
err_quit("Usage: is directory_name");
}
if ((dp = opendir(argv[1])) == NULL) {
err_sys("Can not open %s\n",argv[1]);
}
while ((dirp = readdir(dp)) != NULL) {
printf("%s\n",dirp->d_name);
}
}
四、工做目錄:
每個進程都有一個工做目錄(working directory),有時也稱爲當前工做目錄(current working directory)。因此相對路徑名都從工做目錄開始解釋。進程能夠用chdir函數更改工做目錄。命令行
輸入輸出線程
一、文件描述符(file descriptor):
一般是一個小的非負整數,內核用以表示一個特定進程正在訪問的文件。當內核打開一個現有文件或者建立一個新文件時,它都返回一個文件描述符。在讀、寫文件時,可使用這個文件描述符。接口
二、標準輸入、標準輸出和標準錯誤:
按照慣例,每當運行一個新程序時,全部的shell都爲其打開三個文件描述符,既標準輸入(standard input)、標準輸出(standard output)以及標準錯誤(standard error)。進程
三、不帶緩衝的IO:
函數open、read、write、lseek以及close提供了不帶緩衝的I/O。這些函數都使用文件描述符。
#include "apue.h"
#define BUFFERSIZE 4096
int main(void)
{
int n;
char buf[BUFFERSIZE];
while (n = read(STDIN_FILENO, buf, BUFFERSIZE) > 0) {
if (write(STDOUT_FILENO, buf, n) != n) {
err_sys("write error");
}
}
if (n < 0) {
err_sys("read error");
}
exit(0);
}
四、標準I/O
標準I/O函數爲那些不帶緩衝的I/O函數提供了一個帶緩衝的接口。使用標準I/O函數無須擔憂如何選取最佳的緩衝區大小。使用標準I/O函數還能建行對輸入行的處理。例如,fgets函數讀取一個完成的行,而read函數讀取指定字節 數。
函數fgetc一次讀取一個字符,而後函數putc將此字符寫到標準輸出。讀到輸入的最後一個字節時,getc返回常量EOF。
程序和進程
一、程序:
程序是一個存儲在磁盤上某個目錄的可執行文件。內核使用exec函數將程序讀入內存並執行程序。
二、進程和進程ID:
程序的執行實例稱爲進程(process)。某些操做系統用任務(task)來表示正在被執行的程序。
UNIX系統確保每個進程都有一個惟一的數字標識符,稱爲進程ID(process ID)。進程ID老是一個非負整數。
#include "apue.h"
int main(void)
{
printf("hello world from process ID %ld\n", (long)getpid());
exit(0);
}
三、進程控制:
有三個用於進程控制的主要函數:fork、exec和waitpid。(exec函數有7中變體,但常常把它們統稱爲exec函數。)
//TODO
四、線程和線程ID:
一個進程內的全部線程共享同一地址空間、文件描述符、棧以及與集成相關的屬性。由於它們能訪問同一存儲區,因此各線程在訪問共享數據時須要採起同步措施以免不一致性。
與進程相同,線程也用ID標識。可是,線程ID只在它所屬的進程內起做用。一個進程中的線程ID只在它所屬的進程中起做用。一個進程中的線程ID在另外一個進程中沒有意義。在一個進程中對某個特定的線程進行處理時,我麼能夠 使用該線程的ID引用它。
時間值:
UNIX系統有兩種不一樣的時間值。
一、日曆時間:
該值是自協調世界時1970年1月1日00:00:00這個特定時間以來所通過的秒數累計值。這些時間值可用於記錄文件最近一次的修改時間。
系統基本數據類型time_t用於保存這種時間值。
二、進程時間:
也被稱爲CPU時間,用以度量進程使用的中央處理器資源。進程事件以時鐘滴答計算。
系統基本數據類型clock_t保存這種時間值。
系統調用和庫函數:
全部的操做系統都提供屢次服務的入口點,由此程序想內核請求服務。各類版本的UNIX實現都提供良好定義、數量有限、直接進入內核的入口點,這些入口點被稱爲系統調用(system call)。