歡迎關(guān)注我的博客Zhuhao's Blog獲取最新文章
簡(jiǎn)單的說,每個(gè)應(yīng)用在運(yùn)行時(shí)就會(huì)產(chǎn)生一個(gè)進(jìn)程性湿,這個(gè)進(jìn)程就對(duì)這個(gè)應(yīng)用負(fù)責(zé)涯穷,掌握這個(gè)應(yīng)用的運(yùn)行狀態(tài)换帜。
可是為什么還要用一個(gè)進(jìn)程來控制一個(gè)應(yīng)用呢,下面將會(huì)簡(jiǎn)單的解釋一下涯塔。
現(xiàn)在的應(yīng)用對(duì)于資源的要求都是獅子大開口肌稻,開口就是幾個(gè)G,一臺(tái)電腦的內(nèi)存一般也就幾個(gè)G匕荸,總不能一臺(tái)電腦就跑這一個(gè)應(yīng)用吧爹谭。為了解決這個(gè)問題,操作系統(tǒng)就使用了虛擬內(nèi)存榛搔,讓每個(gè)進(jìn)程代表一個(gè)應(yīng)用诺凡,給每個(gè)進(jìn)程一種自己獨(dú)霸整臺(tái)電腦的假象,然后操作系統(tǒng)進(jìn)行上下文切換践惑,只把這個(gè)進(jìn)程正好需要使用的資源放進(jìn)內(nèi)存腹泌;這樣每個(gè)進(jìn)程都有自己獨(dú)有的資源。
創(chuàng)建進(jìn)程
創(chuàng)建進(jìn)程需要一個(gè)系統(tǒng)調(diào)用 fork()尔觉,fork可以創(chuàng)建一個(gè)和當(dāng)前進(jìn)程映像一樣的進(jìn)程凉袱;成功時(shí)創(chuàng)建子進(jìn)程并返回子進(jìn)程的pid,失敗時(shí)不會(huì)創(chuàng)建子進(jìn)程侦铜,返回-1并設(shè)置相應(yīng)的errno专甩。
順便介紹一下pid,pid是進(jìn)程的ID钉稍,數(shù)據(jù)類型是pid_t配深,在Linux中被定義為int〖廾ぃ可以調(diào)用 getpid()來獲得調(diào)用進(jìn)程的pid篓叶,還可以通過調(diào)用 getppid() 來獲得調(diào)用進(jìn)程的父進(jìn)程的pid。
運(yùn)行進(jìn)程
運(yùn)行進(jìn)程需要調(diào)用 exec 系統(tǒng)調(diào)用羞秤,但是不存在單一的exec函數(shù)缸托,他是由一系列的exec函數(shù)組成的。
以一個(gè)最簡(jiǎn)單的調(diào)用 execl() 為例:
- 成功的execl()調(diào)用改變 地址空間 和進(jìn)程映像
- 所有的掛起的信號(hào)都會(huì)丟失
- 捕捉到的所有信號(hào)都會(huì)還原為默認(rèn)處理方式
- 丟棄所有的內(nèi)存鎖
- 大多數(shù)進(jìn)程的屬性會(huì)還原成默認(rèn)值(pid 父進(jìn)程的pid 優(yōu)先級(jí) 所屬的用戶和組 不會(huì)變)
- 清空和進(jìn)程內(nèi)存地址空間相關(guān)的所有數(shù)據(jù)瘾蛋,包括所有映射的文件
終止進(jìn)程
終止進(jìn)程使用的是 exit() 系統(tǒng)調(diào)用俐镐,參數(shù)用于表示進(jìn)程的推出狀態(tài), EXIT_SUCCESS和 EXIT_FAILURE 這兩個(gè)可移植的宏分別表示成功和失敳负摺(也可以使用0和非0值來表示佩抹,不過可移植性就差了)叼风。
簡(jiǎn)單的表示成功退出就使用
exit(EXIT_SUCCESS);
這個(gè)系統(tǒng)調(diào)用會(huì)先完成在用戶空間需要做的事,再調(diào)用_exit()再處理內(nèi)核中的事棍苹。
在用戶空間做的事
- 調(diào)用任何由 atexit() 或 on_exit() 注冊(cè)的函數(shù)无宿,按在系統(tǒng)中注冊(cè)的相反順序。(假如在exit()前運(yùn)行了atexit(a) atexit(b)枢里,那么在調(diào)用exit()后就會(huì)先運(yùn)行b再運(yùn)行a )
- 清空所有已打開的標(biāo)準(zhǔn)I/O流
- 刪除有tmpfile()函數(shù)創(chuàng)建的所有臨時(shí)文件
內(nèi)核會(huì)清理進(jìn)程所創(chuàng)建的 不再使用的所有資源這包括但不局限于:分配內(nèi)存 打開文件和System Ⅴ的信號(hào)量孽鸡。清理完成后,內(nèi)核會(huì)摧毀進(jìn)程栏豺,并告知父進(jìn)程其子進(jìn)程已經(jīng)終止彬碱。