1.普通文件(-) 注:-是普通文件的標識linux
(1)文本文件:文件中的內容是由文本構成的,文本指的是ASCII碼字符。文本里的內容本質上都是數字。而文本文件中的數字自己應該被理解爲這個數字對應的ASCII碼。常見的.c文件,.h文件,.txt文件等都是文本文件。正則表達式
(2)二進制文件:二進制文件中存儲的本質上也是數字,只不過這些數字並非文件的編碼數字,而是就是正真的數字。常見的可執行程序文件(gcc編譯生成的a.out,arm-linux-gcc編譯鏈接生成的.bin)都是二進制文件。shell
(3)使用文本編輯器去打開文件的時候,編輯器會read讀出文件二進制數字內容,而後按照編碼格式去解碼將其還原成文字展示給咱們。編程
(4)若是使用文本編輯器去打開一個二進制文件會如何?這個時候編輯器就覺得這個二進制文件仍是文本文件而後試圖將其解碼成文字,可是解碼過程不少數字並不對應有意義的文字因此成了亂碼。ubuntu
(5)用二進制閱讀工具去讀取文本文件會怎麼樣?得出的就是文本文字所對應的二進制的編碼。數組
2.目錄文件(d)服務器
(1)目錄就是文件夾,文件夾在Linux中也是一種文件,不過是特殊文件。用vi打開一個文件夾就能看到,文件夾其實也是一種特殊文件,裏面存的內容包括這個文件的路徑,還有文件夾裏面的文件列表。網絡
3.設備文件 (字符設備文件的標識符:c,塊設備文件(b))數據結構
(1)設備文件對應的是硬盤設備,也就是說這個文件雖然在文件系統中存在,可是並非真正存在於硬盤上的一個文件,而是文件系統虛擬製造出來的(叫虛擬文件系統,如/dev/ sys/ proc等)。多線程
4.管道文件標識符(p),套接字文件標識符(s) 符號鏈接符文件(l)
5.查看文件屬性:stat、fstat、lstat。stat是從文件名出發獲得文件屬性信息結構體,而fstat是從一個已經打開的文件fd出發獲得一個文件的屬性信息。stat是從磁盤去讀取文件的,而fstat是從內存讀取動態文件的。對於符號連接文件,stat和fstat查閱的是符號連接文件指向的文件的屬性,而lstat查閱的是符號連接文件自己的屬性。
6.struct stat是內核定義的一個結構體,在<sys/stat.h>中聲明,這個結構體中的全部元素加起來就是咱們的文件屬性信息。
7.文件屬性中的文件類型標誌(-、d、l等等)在struct stat結構體的mode_t st_mode元素中,這個元素實際上是一個按位來定義的一個位標誌。
8.文件類型和文件的權限都記錄在st_mode中。
9.ls -l 打印出的權限列表
(1)123456789 一共9位,3個一組。第一組三個表示文件的屬主(owner、user)對該文件的可讀、可寫、可執行權限;第2組3個位表示文件的屬主所在的組(group)對該文件的權限;第3組3個位表示其餘用戶(othres)對該文件的權限。
(2)能夠用chown命令修改一個文件的屬主,還能夠用chgrp命令去修改一個文件所在的組。
10.access函數檢查權限設置
(1)access函數能夠測試獲得當前執行程序的那個用戶在當前那個環境下對目標文件是否具備某種操做權限。
11.chmod/fchmod 與權限修改
(1)chmod 是一個linux命令,用來修改文件的各類權限屬性。chmod命令只有root用戶纔有權利去執行修改。
(2)chmod命令其實內部是用linux的一個叫chmod的API實現的。
12.chown/fchown/lchown與屬主修改
(1)linux中有兩個chown命令來修改文件屬性
(2)chown命令是用chown API實現的。
13.umask與文件權限掩碼
(1)umask的做用是用來設定咱們系統中新建立的文件的默認權限的。
(2)umask 命令就是用umask API實現的。
14.讀取目錄文件
(1)opendir打開一個目錄後獲得一個DIR類型的指針給readdir使用
(2)readdir函數調用一次就會返回一個struct dirent類型的指針,這個指針指向一個結構體變量,這個結構體變量裏面記錄了一個目錄項(所謂目錄項就是目錄中的一個子文件)。
(3)readdir 調用一次只能讀取一個目錄項,要想讀取目錄中全部的目錄項必須屢次調用readdir函數。readdir函數內部戶記住哪一個目錄項已經被讀過了哪一個還沒讀,因此屢次調用後不會重複返回已經返回過的目錄項。當readdir函數返回NULL時就表示目錄中全部的目錄項已經讀完了。
15.GMT時間
(1)GTM是格林尼治時間,也就是格林尼治世間的當地時間,全球國際時間,用一描述全球性的事件的時間。
16.計算機中與時間有關的部件
(1)點時間和段時間.段時間=點時間-點時間
(2)定時器(timer)定的時間就是段時間,實時時鐘(RTC)就是和點時間有關的一個器件。
17.jiffies
(1)jiffies是linux內核中的一個全局變量,這個變量用來記錄之內核的節拍時間爲單位時間長度的一個數值。
(2)內核配置的時間定義了一個節拍時間,實際上linux內核的調度系統工做時就是以這個節拍時間爲時間片的。
(3)jiffies變量開機時有一個基準值,而後內核每過一個節拍時間jiffies就會加1,而後到了系統的任意一個時間咱們當前時間就被jiffies這個變量所標註。
18.linux系統如何記錄時間
(1)內核在開機啓動的時候會讀取RTC硬件獲取一個時間做爲初始基準時間,這個基準時間對應一個jiffies值(這個基準時間換算成jiffies值的方法是:用這個時間減去1970-01-01 00:00:00 +0000 (UTC),,而後把這個時間段換算成jiffies數值)。這個jiffies值做爲咱們開機時的基準jiffies值存在。而後系統運行時每一個時鐘節拍的末尾都會給jiffies這個全局變量加1,所以操做系統會使用歐冠jiffies這個全局變量記錄了下來當前的時間。
(2)其實操做系統只在開機時讀一次RTC,整個操做系統運行過程當中RTC是物做用的。RTC的正真做用實際上是在OS的2次開機之間進行時間的保存。
(3)jiffies這個變量記錄的實際上是段時間(其實就是當前時間和1970-01-01 00:00:00 +0000(UTC)這個時間的差值)
(4)一個時間節拍的時間取決於操做系統的配置,現代linux系統通常是10ms或者1ms。這個時間其實就是調度時間,在內核中用HZ來記錄和表示。若是HZ定義成1000難麼時鐘節拍就是1/HZ,也就是1ms。
19.linux中時間相關的系統調用
(1)經常使用的時間相關的API和C庫函數有9個:
time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday
(2)time系統調用返回當前時間以秒爲單位的距離1970-01-01 00:00:00 +0000(UTC)過去的秒數。這個time內部就是用jiffies換算獲得的秒數。其餘函數基本都是圍繞着time來工做的。
(3)gmtime(國際時間)localtime(本地時間) 獲得的秒數變成一個struct tm結構體表示的時間。 mktime完成相反的轉換(struct tm 到time_t)
(4)若是從struct tm出發想獲得字符串格式的時間,能夠用asctime或者strftime均可以
(5)gettimeofday返回的時間是由struct timeval(時間)和struct timezone(時區)這兩個結構體來共同表示的。settimeofday是用來設置當前的時間和時區的。
(6)總結:無論用哪一個系統調用,最終獲得的時間本質上都是一個時間(這個時間最終都是從kernel中記錄的jiffies中計算獲得的),只不過不一樣的函數返回的時間格式不一樣,精度不一樣。
(7)getime獲取的時間中:年份是以1990爲基準的差值,月份是0表示1月份。
20.linux中是使用隨機數
(1)連續屢次調用rand函數能夠返回一個僞隨機數序列。單純使用rand重複調用n次,就會獲得0-RAND_MAX之間的序列,每次執行程序獲得的僞隨機數是同一個序列,沒發獲得其餘序列。
(2)srand函數用來設置rand獲取的僞隨機數列的種子。通常常規作法是用time函數的返回值來作srand的參數。
21.proc文件
(1)proc目錄下的文件大小都是0,由於這些文件自己並不存在於硬盤中,他也不是一個真實文件,他只是一個接口,當咱們去讀取這個文件時,其實內核並非去硬盤上找這個文件,而是映射爲內核內部一個數據結構被讀取而且格式化成一個字符串返回給咱們。因此儘管咱們看到的仍是一個文件內容字符串,和普通文件是同樣的;可是實際上咱們知道這個內容是實時的從內核中數據結構來的,而不是硬盤中來的。
(2)cat以手工查找
(3)程序中能夠文件IO訪問
(4)在shell程序中用cat命令結合正則表達式來獲取並處理內核信息。
22.sys文件系統
(1)sys文件系統本質上和proc文件系統是同樣的,都是虛擬文件系統,都在根目錄下有目錄(一個是/proc目錄,另外一個是/sys目錄),所以都不是硬盤中的文件,都是內核中的數據結構的可視化接口。
(2)不一樣的是/proc中的文件只能讀,可是/sys中的文件能夠讀取。讀/sys中的文件就是獲取內核中數據結構的值,而寫入/sys中的文件就是設置內核中的數據結構的元素的值。
23.main函數由誰調用
(1)編譯連接時的引導代碼。
(2)運行時的加載器。
(3)程序在編譯連接時用連接器,運行時用加載器。
(4)argc和argv的傳參如何實現。
24.程序如何結束
(1)正常終止:return 、exit、_exit
(2)非正常終止:本身或他人發信號終止處理函數
(3)atexit註冊進程終止處理函數、atexit註冊多個進程終止處理函數,先註冊的後執行(先進後出、棧)
(4)return和exit效果同樣,都是會執行進程終止處理函數,可是用_exit終止進程時並不執行atexit註冊的進程終止處理函數。
25.環境變量
(1)export命令查看環境變量
(2)進程環境變量表介紹:每個進程中都有一份全部環境變量構成的一個表格,也就是說咱們當前進程中能夠直接使用這些環境變量。進程環境變量表實際上是一個字符串數組,用environ變量指向它。
(3)進程中經過environ全局變量使用環境變量。
(4)獲取執行環境變量函數getenv。
26.進程運行的虛擬地址空間
(1)操做系統中每一個進程在獨立地址空間中運行。
(2)每一個進程的邏輯地址空間均爲4GB(32操做系統)
(3)0-1G爲OS,1-4G爲應用
(4)虛擬地址到物理地址空間的映射
(5)意義:進程隔離,提供多進程同時運行。
27.進程
(1)進程控制塊PCB(process control block),內核中專門用來管理一個進程的數據結構。
(2)查看進程命令 ps、ps -a、ps-aux
28.進程ID
(1)getpid(進程ID)、getppid(父進程ID)、getuid(進程用戶ID)、geteuid(有效用戶ID)、getgid(組ID)、getegid(有效組ID)
(2)實際用戶ID、有效用戶ID
29.多進程調度原理
(1)操做系統同時運行多個進程
(2)宏觀上的並行和微觀上的串行
(3)實際上現代操做系統最小的調度單元是線程而不是進程。
30.fork建立子進程
(1)爲何要建立子進程(1)每一次進程的運行都須要一個進程(2)多進程實現宏觀上的並行。
(2)進程的分裂生長模式。若是操做系統須要一個新進程來運行一個程序,那麼操做系統會用一個現有的進程來複製成一個新進程。老進程叫父進程,複製生成的新進程叫子進程。
(3)fork函數調用一次會返回2次,返回值等於0就是子進程,而返回值大於0的就是父進程。
(4)使用fork的方法:使用fork後而後用if判斷返回值,而且返回值大於0時就是父進程,等於0的就是子進程。
(5)fork的返回值在子進程中等於0,在父進程中等於本次fork建立的子進程的進程ID。
31.子進程
(1)子進程有本身獨有的PCB
(2)子進程被內核同等調度
32.子進程繼承父進程中打開的文件
(1)上下文:父進程先open打開一個文件獲得fd,而後在fork建立子進程。以後在父進程中各自write向fd中寫入內容。
(2)測試結論:結束寫。實際上本質緣由是父子進程之間的fd對應的文件指針是彼此關聯的.
(3)實際測試時有時候會看到只有一個,有點像分貝寫。但實際不是。
33.父子進程各自獨立打開同一文件實現共享。
(1)父進程open打開1.txt而後寫入,子進程打開1.txt而後寫入,結論:分別寫。緣由是父子進程分離後才各自打開的1.txt,這時候兩個進程的PCB已經獨立了,文件表也獨立了,所以2次讀寫是徹底獨立的。
(2)open時使用O_APPEND標誌看看會如何?實際測試結果標明O_APPEND標緻能夠把父子進程各自打開的fd的文件指針關聯起來,實現分別寫。
34.(3二、33)總結
(1)父進程在沒有fork以前本身作的事情對子進程有很大影響,可是父進程fork以後在本身的if裏作的事情就對子進程沒有影響了。本質緣由就是由於fork內部實際上已經複製父進程的PCB生成了一個新的子進程,而且fork返回的子進程已經徹底和父進程脫離,而且獨立被OS調度執行。
(2)子進程最終目的是要獨立去運行另外的程序。
35.進程的消亡
(1)linux系統設計時規定:每個進程退出時,操做系統會自動回收這個進程涉及到的全部資源,可是操做系統只是回收了這個進程工做時消耗的內存和IO,並無回收這個進程自己佔用的內存(主要是task_struct和棧內存)。
(2)由於進程自己的8KB內存(主要是task_struct和棧內存)操做系統不能回收須要別人來輔助回收,所以咱們每一個進程都須要一個幫助它收屍的人,這我的就是進程的父進程。
36.殭屍進程
(1)子進程先於父進程結束。子進程結束後父進程此時並不必定當即就能幫助子進程「收屍」,在這一段(子進程已經結束且父進程還沒有幫其收屍)子進程就被稱爲殭屍進程。
(2)子進程除task_struct和棧外其他內存空間皆已清理。
(3)父進程可使用wait或waitpid回收子進程,此時父進程結束時同樣會回收子進程的剩餘待回收內存資源。(這樣設計是爲了防止父進程忘記顯示調用wait/waitpid來回收子進程從而形成內存泄露)
37.孤兒進程
(1)父進程先於子進程結束,子進程稱爲一個孤兒進程。
(2)linux系統規定:全部的孤兒進程都自動稱爲一個特殊進程(進程1,也就是init進程)的子進程。
38.父進程wait回收子進程
(1)wait的工做原理:
(I)子進程結束時,系統向其父進程發送SIGCHILD信號
(II)父進程調用wait函數後阻塞
(III)父進程被SIGCHILD信號喚醒而後去回收殭屍子進程。
(IV)父子進程之間是異步的,SIGCHILD信號機制就是爲了解決父子進程之間的異步通訊問題,讓父進程能夠及時的去回收殭屍子進程。
(V)若父進程沒有任何子進程則wait返回錯誤。
(2)wait的參數status。status用來返回子進程結束時的狀態,父進程經過wait獲得status後就能夠知道子進程的一些結束狀態信息。
(3)wait的返回值pid_t,這個返回值就是本次wait回收的子進程的PID。當期進程有可能有多個子進程,wait函數阻塞直到其中一個子進程結束wait就會返回,wait的返回值就能夠用來判斷究竟是哪個子進程本次被回收了。
(4)wait作個總結:wait主要是用來回收子進程資源,回收同時還能夠得知被回收子進程的pid和退出狀態。
(5)fork後wait回收實例。
(6)WIFEXITED、WIFSIGNALED、WEXITSTATUS這幾個宏用來獲取子進程的退出狀態。
(I)WIFEXITED宏用來判斷子進程是否正常終止(return、exit、_exit退出)
(II)WIFSIGNALED宏用來判斷子進程是否非正常終止(被信號所終止)
(III)WEXITSTATUS宏用來獲得正常終止狀況下的進程返回值的。
39.waitpid和wait的差異
(1)基本功能同樣,都是用來回收子進程。
(2)waitpid能夠回收指定PID的子進程。
(3)waitpid能夠阻塞式或非阻塞式兩種工做模式。
40.使用waitpid
(1)使用waitpid實現wait的效果 :ret=waitpid(-1,&status,0);-1表示不等待某個特定PID的子進程而是回收任意一個子進程,0表示用默認的方式(阻塞式)來進行等待,返回值ret是本次回收的子進程的PID。
(2)ret=waitpid(pid,&status,0);等待回收PID爲pid的這個子進程,若是當前進程並無一個ID號爲pid的子進程,則返回值爲-1;若是成功回收了pid這個子進程則返回值爲回收的進程的PID。
(3)ret=waitpid(pid,&status,WNOHANG);這種表示父進程要非阻塞式的回收子進程。此時若是父進程執行waitpid時子進程已經先結束等待回收則waitpid直接回收成功,返回值是回收的子進程的PID;若是父進程waitpid時子進程還沒有結束則父進程馬上返回(非阻塞),可是返回值爲0(表示回收不成功)。
41.競態初步引入
(1)靜態全稱是:競爭狀態,多進程環境下,多個進程同時搶佔系統資源(內存、CPU、文件IO)
(2)競爭狀態對OS來講是很危險的,此時OS若是沒處理好就會形成結果不肯定。
42.爲何須要exec函數
(1)fore子進程是爲了執行新程序(fork建立了子進程後,子進程和父進程同時被OS調度執行,所以子進程能夠單獨的執行一個程序,這個程序宏觀上將會和父進程程序同時進行)
(2)能夠直接在子進程的if中寫入新程序的代碼。這樣能夠,但不夠靈活,由於咱們只能把子進程程序的源代碼貼過來執行。
(3)使用exec族運行新的可執行程序(exec族函數能夠直接把一個編譯好的可執行程序直接加載運行)
(4)咱們有了exec族函數後,咱們典型的父子進程程序是這樣的:子進程須要運行的程序被單獨編寫,單獨編譯鏈接成一個可執行程序(叫hello),(項目是一個多進程項目)主程序爲父進程,fork建立了子進程後在子進程中exec來執行hello,達到父子進程分別作不一樣程序同時(宏觀上)運行的效果。
43.exec族的6個函數
(1)execl和execv
(2)execlp和execvp
(3)execle和execvpe
44.進程狀態
(1)就緒態:這個進程當前全部運行條件就緒,只要獲得了CPU時間就能直接運行。
(2)運行態:就緒態獲得了CPU就進入運行態開始運行。
(3)殭屍態:進程已經結束可是父進程還沒來得及回收。
(4)等待態:(淺度睡眠&深度睡眠),進程在等待某種條件,條件成熟後可進入就緒態。等待態下就算你給他CPU調度進程也沒法執行。淺度睡眠等待時進程能夠被(信號)喚醒,而深度睡眠等待時不能被喚醒只能等待的條件到了才能結束睡眠狀態。
(5)暫停態:暫停並非進程的終止,只是被人(信號)暫停了,還能夠回覆的。
45.system函數
(1)ststem函數=fork+exec;
(2)原子操做:原子操做意思就是整個操做一旦開始就會不被打斷的執行玩。原子操做的好處就是不會被人打斷(不會引來競爭關係),壞處是本身單獨連續佔用CPU時間太長影響系統總體實時性,所以應該儘可能避免沒必要要的原子操做,就算不得不原子操做也應該儘可能原子操做的時間縮短。
46.守護進程
(1)進程查看命令ps
(I)ps -ajx 偏向顯示各類有關的ID號
(II)ps -aux 偏向顯示進程各類佔用資源
(2)向進程發送信號指令kill
(I)kill -信號編號 進程ID,向一個進程發送一個信號
(II)kill -9 xxx 將向xxx這個進程發送9號信號,也就是要結束進程。
(3)daemon 標識守護進程,簡稱爲d(進程名後面帶d的基本就是守護進程)
(4)長期運行(通常是開機運行直到關機時關閉)
(5)與控制檯脫離(普通進程都和運行該進程的控制檯相綁定,表現爲若是終端被強制關閉了則這個終端中運行的全部進程都被會關閉,背後的問題還在於會話)
(6)服務器程序通常都實現爲守護進程。
(7)syslogd,系統日誌守護進程,提供syslog功能。
(8)cron,cron進程用來實現操做系統的時間管理,linux中實現定時執行程序的功能就要用到cron。
(9)任何一個進程均可以將本身實現成守護進程。
47.create_daemon函數要素
(1)子進程等待父進程退出
(2)子進程使用setsid建立新的會話期,脫離控制檯
(3)調用chdir將當前工做目錄設置爲/
(4)umask設置爲0以取消任何文件權限屏蔽
(5)關閉全部文件描述符
(6)將0、一、2定位到/dev/null
48.使用syslog來記錄調試信息
(1)openlog,syslog,closelog
(2)通常log信息都在操做系統的 /var/log/messages這個文件中存儲着,可是ubuntu中是在/var/log/syslog文件中的,查看cat /var/log/syslog。
49. syslog的工做原理
(1)操做系統中有一個守護進程syslogd(開機運行,關機結束),這個守護進程syslogd負責進行日誌文件的寫入和維護。
(2)syslogd時獨立於咱們任意一個進程而運行的。咱們當前進程和syslogd進程原本時沒有任何關係的,可是咱們當前進程能夠經過調用openlog打開一個和syslogd相鏈接的通道,而後經過syslog向syslogd發送消息,而後由syslogd來將其寫入到日誌文件系統中。
(3)syslogd其實就是一個日誌文件系統的服務器進程,提供日誌服務。任何須要寫日誌的進程均可以經過openlog/syslog/closelog這三個函數來利用syslogd提供的日誌服務。這就是操做系統的服務式的設計。
50.讓進程不能屢次運行
(1)咱們的程序具備一個單例運行的功能。運行程序,沒有運行則運行,若是已經運行,則本次直接退出。
(2)最經常使用的實現方法:用一個文件的存在是否來作標誌。
51.linux的進程間通訊
(1)爲何須要進程間通訊
(I)進程間tongxin(IPC)指的是2個任意進程之間的通訊。
(II)同一個進程在一個地址空間中,因此同一個i額進程的不一樣模塊(不一樣函數、不一樣文件)之間都是很簡單的(不少時候i是全局變量,也能夠經過函數形參實參傳遞)
(III)2個不一樣的進程處於不一樣的地址空間,所以要互相通訊很難。
(2)linux內核提供多種進程間通訊機制
(I)無名管道和有名管道
(II)SystemV IPC:信號量、消息隊列、共享內存
(III)Socket域套接字
(IV)信號
52.linux的IPC機制
(1)管道(無名管道)
(I)管道通訊的原理:內核維護的一塊內存,有讀端和寫端(管道是單向通訊的)。
(II)管道通訊的方法:父進程建立管理後fork子進程,子進程繼承父進程的管道fd
(III)管道通訊的限制:只能在父子進程間通訊、半雙工。
(IV)管道通訊的函數:pipe、write、read、close
(2)有名管道(fifo)
(I)有名管道原理:實質也是內核維護的一塊內存,表現形式爲一個有名字的文件
(II)有名管道的使用方法:固定一個文件名,2個進程分別使用mkfifo建立fifo文件,而後分別open打開獲取到fd,而後一個讀一個寫。
(III)管道通訊限制:半雙工(不限父子進程,任意2個進程均可)
(IV)管道通訊的函數:mkfifo、open、write、read、close
53.SystemV IPC介紹
(1)SystemV IPC的基本特色
(I)系統經過一些專用API來提供SystemV IPC功能
(II)分爲:信號量、消息隊列、共享內存、信號、Unix域套接字socket
(III)其實質也是內核提供的公共內存。
54.消息隊列
(1)本質上是一個隊列,隊列能夠理解爲(內核維護的一個)FIFO
(2)工做時A和B2個進程進行通訊,A向隊列中放入消息,B從隊列中讀出消息。
55.信號量
(1)實質就是個計數器(其實就是一個能夠用來計數的變量,能夠理解爲int a)
(2)經過計數值來提供互斥和同步
56.共享內存
(1)大片內存直接映射
(2)相似於LCD顯示時的顯存用法
57.什麼是信號
(1)信號是內容受限的一種異步通訊機制
(I)信號的目的:用來通訊
(II)信號是異步的(對比硬件中斷)
(III)信號本質上是int型數字編號(事先定義好的)
(2)信號由誰發出的
(I)用戶在終端按下按鍵
(II)硬件異常後由操做系統內核發出信號
(III)用戶使用kill命令向其餘進程發出信號。
(IV)某種軟件條件知足後也會發出信號,如alarm鬧鐘時間到會產生SIGALARM信號,向一個讀端已經關閉的管理write時會產生SIGPIPE信號。
(3)信號由誰處理、如何處理
(I)忽略信號
(II)捕獲信號(信號綁定了一個函數)
(III)默認處理(當前進程沒有明顯的管這個信號,默認:忽略或終止進程)。
58.常見信號介紹
(1)SIGINT 2 Ctrl+C時OS送給前臺進程組中每一個進程
(2)SIGABRT 6 調用abort函數,進程異常終止
(3)SIGPOLL SIGIO 8 指示一個異步IO事件,在高級IO中說起
(4)SIGKILL 9 殺死進程的終極辦法
(5)SIGSEGV 11 無效存儲訪問時OS發出該信號
(6) SIGPIPE 13 涉及管道和socket
(7)SIGALARM 14 涉及alarm函數的實現
(8)SIGTERM 15 kill命令發送的OS默認終止信號
(9)SIGCHLD 17 子進程終止或中止時OS向其父進程發此信號
(10)
SIGUSR1 10 用戶自定義信號,做用和意義由應用本身定義
SIGUSR2 12
59.進程對信號的處理
(1)用signal函數處理SIGINT信號
(1)默認處理
(2)忽略處理
(3)捕獲處理
細節:
(1)signal函數綁定一個捕獲函數後信號發生後會自動執行綁定的捕獲函數,而且把信號編碼做爲傳參傳給捕獲函數
(2)signal的返回值在出錯時爲SIG_ERR,綁定成功時,返回舊的捕獲函數
60.signal函數的優缺點
(1)優勢:簡單好用,捕獲信號經常使用
(2)缺點:沒法簡單直接得知以前設置的對信號的處理方法
61.sigaction函數介紹
(1)2個都是API,可是sigaction比signal更具備可移植性。
(2)用法關鍵是2個sigaction指針
(3)sigaction比signal好的一點:sigaction能夠一次獲得設置新捕獲函數和獲取舊的捕獲函數(其實還能夠單獨設置新的捕獲函數或者單獨只獲取舊的捕獲函數),而signal函數不能單獨獲取舊的捕獲函數而必須在設置新的捕獲函數的同時才獲取舊的捕獲函數。
62.alarm函數
(1)內核以API形式提供的鬧鐘
63.pause函數
(1)內核實踐
(2)pause函數的做用就是讓當前進程暫停運行,交出CPU給其餘進程去執行。噹噹前進程進入pause狀態後當前進程會表現爲"卡住、阻塞住",要退出pause狀態當前進程須要被信號喚醒。
64阻塞IO
(1)常見的阻塞:write、pause、sleep等函數;read或write某些函數
(2)如何實現非阻塞IO訪問:O_NONBLOCK和fcntl
65.何爲IO多路複用
(1)IO multiplexing
(2)多路非阻塞式IO
(3)select和poll
(4)外部阻塞式,內部非阻塞式自動輪詢多路阻塞式IO
(5)IO多路複用實踐
(I)用select函數實現同時讀取鍵盤鼠標
(II)用poll函數實現同時讀取鍵盤鼠標
66.異步IO
(1)幾乎能夠認爲:異步IO就是操做系統用軟件實現的一套中斷相應系統
(2)異步IO的工做方法是:咱們當前進程註冊一個異步IO事件(使用signal註冊一個信號SIGIO的處理函數),而後當前進程能夠正常處理本身的事情,當異步事件發生後當前進程會收到一個SIGIO信號從而執行綁定的處理函數處理這個異步事件
(3)涉及的函數:
(1)fcntl(F_GETFL、F_SETFL、O_ASYNC、F_SETOWN)
(2)signal或者sigaction(SIGIO)
67.進程
(1)使用進程技術的優點
(I)CPU時分複用,單核心CPU能夠實現宏觀上的並行
(II)實現多任務系統需求(多任務的需求是客觀的)
(2)進程技術的劣勢
(I)進程間切換開銷大
(II)進程間通訊麻煩並且效率低
(3)解決方案就是線程技術
(I)線程技術保留了進程技術實現多任務的特性。
(II)線程的改進就是在線程間切換和線程間通訊上提高了效率。
(III)多線程在多核心CPU上面更有優點。
68.線程
(1)linux中的線程簡介
(I)一種輕量級進程
(II)線程是參與內核調度的最小單元
(III)一種進程中能夠由多個現場
(2)線程技術的優點
(I)像進程同樣可被OS調度
(II)同一進程的多個線程之間很容易高校率通訊
(III)在多核心CPU(對稱多處理器架構SMP)架構下效率最大化。
69.線程常見函數
(1)線程建立與回收
(I)pthread_create 主線程用來建立子線程
(II)pthread_join 主線程用來等待(阻塞)回收子線程
(III)pthread_detach 主線程用來分離子線程,分離後主線程沒必要再去回收子線程
(2)線程取消
(I)pthread_cancel 通常都是主線程調用該函數去取消(讓它趕忙死)子線程
(II)pthread_setcancelstate 子線程設置本身是否容許被取消
(III)pthread_setcanceltype
(3)線程函數退出相關
(I)pthread_exit與return 退出
(II)pthread_cleanup_push
(III)pthread_cleanup_pop
(4)取消線程id
(I)pthread_self
70.線程同步之信號量12
(1)任務:用戶從終端輸入任意字符而後統計個數顯示,輸入end則結束
(2)使用多線程實現:主線程獲取用戶輸入並判斷是否退出,子線程計數。
71.互斥鎖
(1)互斥鎖又叫互斥量(mutex)
(2)相關函數:pthread_mutex_init pthread_mutex_destory pthread_mutex_lock pthread_mutex_unlock
(3)互斥鎖和信號量的關係:能夠認爲互斥鎖是一種特殊的信號量
(4)互斥鎖主要用來實現關鍵段保護。
72.現成同步之條件變量
(1)相關函數:pthread_cond_init pthread_cond_destroy pthread_cond_wait phtread_cond_signal/pthread_cond_broadcast
73.網絡通訊
(1)從進程間通訊提及:網絡域套接字socket,網絡通訊其實就是網絡網絡中不一樣主機上,面的2個進程之間的通訊
(2)網絡通訊的層次
(I)硬件設備:網卡
(II)操做系統底層:網卡驅動
(III)操做系統API:socket接口
(IV)應用層:低級(直接基於socket接口編程)
(V)應用層:高級(基於網絡通訊應用框架庫)
(VI)應用層:更高級(http、網絡控件)
74.網絡通訊的傳輸媒介
(1)無限傳輸:WIFI、藍牙、zigbee、4G/5G/GPRS等。
(II)無限傳出:雙絞線、同軸電纜、光釺等