《APUE》筆記

1. UNIX基礎知識

  1. 口令文件/etc/passwd,格式 root:x:0:0:root:/root:/bin/bash,分別表示登錄名、加密口令(看到的都是x),用戶ID、組ID、註釋、起始目錄、shell程序。
  2. 常用的Shell程序有Bourne shell(/bin/sh)和Bourne-again shell(/bin/bash)。OS X中的sh是bash的副本。
  3. 在最高層次的根目錄中,. 與..都指向當前目錄。
  4. ls(1) 這種表示方法表示這個指令在手冊的第一部分。
  5. cc是C編譯器,在配置gcc的系統中,通常鏈接至gcc.
  6. main的argc爲命令接受參數的個數,argv[]則存儲這些參數(argv[0]爲程序名稱,後面纔是參數)。
  7. dirent.h代表的是 Directory Entry.

  8. 文件描述符(file descriptor)通常是一個小的非負整數,如標準輸入(0)、標準輸出(1)、標準錯誤(2)。在重定向時,都指向shell。

  9. 重定向:ls < infile.txt >outfile.txt 2>&1 。表示重定向輸出和輸入,並將標準錯誤指向標準輸出。
  10. 管道是將前者的標準輸出轉到後者的標準輸入。
  11. 大多數系統函數出錯時返回-1。
  12. 標準IO函數爲不帶緩衝的IO函數提供一個帶緩衝的接口。如printf, fgets屬於標準IO函數。

  13. 程序的執行實例被稱爲進程(process)。

  14. 大多數進程ID可以用整型表示,用長整型可以提高可移植性。
  15. 3個進程控制的主要函數:fork、exec(存在變體) 和 waitpid。
  16. fork調用一次,返回兩次,對父進程返回新的進程ID,對子進程返回0.
  17. Ctrl+D或^D是默認的文件結束符。
  18. 一個進程內的所有線程共享同一地址空間、文件描述符、棧(共享空間,線程有自己的棧地址)以及與進程相關的屬性。
  19. 線程ID只在同一進程內起作用。

  20. 函數出錯時,通常會設置errno值,errno可以一個包含出錯編號的整數,也可以是返回出錯編號指針的函數 。

  21. 如果沒有出錯,不會清除errno的值,並且errno一定不爲0.
  22. string.h中的char *strerror(int errnum);返回當前出錯信息。
  23. stdio.h中的void perror(const char *msg);按”msg: 出錯信息”的格式 輸出到標準輸出,msg通常傳入argv[0]既程序名稱。
  24. errono.h中定義的錯誤分成致命性錯誤和非致命性錯誤。

  25. user ID標識不同的用戶,ID爲0的用戶爲root或superuser。

  26. group ID主要用爲不同組提供不同的權限。
  27. supplementary group ID (附屬組),在/etc/group中的第四個字段指定,可以指定多個附屬組。增加分組的靈活性,擁有和和附屬組中原成員一樣的權限。

  28. 中斷鍵Ctrl+C,退出鍵Ctrl+\ ,會發送對應的信號到線程,可以通過signal註冊自定義處理這些信號的函數。

  29. UNIX使用兩種時間值,日曆時間(time_t)是自協調時所經過的秒數累計值。

  30. 進程時間(clock_t)或者稱爲CPU時間,以時鐘嘀嗒計算。
  31. 進程的運行總時間(wall clock time),與周時運行的進程數有關。本書說到這個時間時,默認沒有其他活動。
  32. 用戶CPU時間是總時間除去系統服務(read或write等)的時間。
  33. 獲取進程的各個時間:”time -p 指令“。

  34. C庫函數並不等於系統調用,系統調用提供一種最小接口,庫函數提供比較複雜的功能。

  35. 可使用sbrk(一個系統調用)分配一塊空間給進程,然後定義分配算法(在用戶層次管理這些空間,不使用malloc)。

2. UNIX標準及實現

  1. ANSI是美國國家標準學會,是ISO國際標準化組織的代表美國的成員。
  2. ISO C是爲了提供C程序的可移植性,規定了其語法和標準庫。
  3. restrict關鍵字和const修飾常指針一樣使用,表示指向的對象在函數中只通過該指針進行訪問。
  4. POSIX(可移植操作系統接口)是一個標準,其中分爲1003.1和1003.2和SUS,1003.1通常成爲POSIX.1, POSIX.1 也吸收了1003.2和SUS的東西。本書相關的是POSIX.1標準。
  5. ISO C將編譯時限制列在

3. 文件I/O

  1. 本章說明文件在讀寫相關的操作。

4. 文件和目錄

  1. 本章說明文件和目錄相關的操作,如文件類型、目錄權限、符號鏈接、創建時間等相關。

5. 標準I/O庫

  1. 詳細介紹printf等一系列函數。

6. 系統數據文件和信息

  1. 數據文件是指/et/passwd這樣的文件。
  2. 本章說明操作這些文件的各種函數。

7. 進程環境

  1. 內核用exec執行程序時,先用一個特殊的啓動例程獲得命令行參數和環境量,再調用main函數。
  2. main返回時,啓動例程會調用exit。
  3. exit會執行一些標準IO的清理關閉操作和調用atexit註冊的函數(調用順序與註冊順序相反),_exit立即退出並進入內核。
  4. argv[argc]是一個NULL指針。
  5. 環境變量表保存在environ中,使用getenv,putenv訪問。
  6. calloc會對新分配的空間初始爲0,而malloc不會。
  7. malloc會分配比申請的空間稍大一點的空間,用於存放管理信息。
  8. goto 不跨函數,可使用setjmp和longjmp實現。
  9. 使用getrlimit 和 setrlimit 查詢和更改進程的資源限制,如棧大小,可以打開的最大文件數等。

8. 進程控制

  1. fork後獲得父進程的副本,包括進程的數據空間、堆和棧、打開的文件描述符等。
  2. fork後子進程和父進程的執行順序不確定 。
  3. fork用來複制自己和執行一個不同的程序(fork後執行exec)。
  4. exec後放棄當前的進程地址空間而使用了新的地址空間來加載exec需要的可執行文件。
  5. wait 等待一個子進程終止,如果子進程還在運行,則阻塞,waitpid可以設置不阻塞並可制定pid。
  6. 競爭條件:當多個進程都企圖對共享數據進行某種處理,而最後結果又取決於進程運行的順序。
  7. 解釋器文件是指首行有#! /bin/sh 這樣的文件。
  8. 使用system來執行命令和程序,相比於fork+exec,它進行了各種出錯處理和信號處理。
  9. 設置進程的nice值可以改變進程的優先級。

9. 進程關係

  1. 主要講會話的概念,會話是一個或多個進程組的集合。
  2. 一個其父進程已經終止的進程稱爲孤兒進程(orphan process),這種進程由init進程收養。
  3. 進程組也可能成爲孤兒。

10. 信號

  1. 信號是一種軟件中斷,提供處理異步事件的方法。信號名以SIG開頭。
  2. 系統調用分成低速系統調用和其它,低速調用可使進程永遠阻塞,這些調用可以被信號打斷,並可以提供自動重啓。
  3. 在信號處理程序中保證調用安全的函數,被稱爲異步安全(async-signal safe)的。其保證可重入,並阻塞會引起不一致信號的發送。
  4. 非異步信號安全函數特點:使用靜態數據結構、調用malloc或free、是標準IO函數。

11. 線程

  1. POSIX線程的功能測試宏_POSIX_THREADS。
  2. 線程ID是 pthread_t 類型,只在進程上下文中有意義。
  3. pthread_mutex_timedlock超時後返回錯誤碼。
  4. 讀寫鎖與普通互斥鎖的不同之處在於,加鎖狀態分爲讀模式和寫模式。讀模式加鎖時,其它線程可以繼續加鎖。
  5. 條件變量是另一種同步機制, 相似於“事件”的概念, 阻塞等待某事件的發生。
  6. 自旋鎖因爲會一直忙等狀態,適用於鎖持有時間短,不希望在調度上花太多成本。
  7. 因爲互斥鎖有一些優化,自旋鎖只有在特殊情況會用到。
  8. “屏障”也是一種同步機制,init時指一個計數,多個線程裏wait,只有在執行wait的次數到達init指定的次數時,纔會繼續執行。可用於分工合作然後將各自的成果進行合併這樣的場景。

12. 線程控制

  1. 同樣可以使用sysconf獲得線程的限制
  2. 在創建線程時,傳入pthread_attr_t 來設置線程的屬性。幾個同步機制也有相關屬性設置。
  3. 如果一個函數在相同的時間點可以被 多個線程安全地調 用,則是線程安全的。
  4. 線程安全不一定是異步信號安全,因爲異步信號安全除了保證可重入外,還阻塞會引起不一致信號的發送。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章