exec的不同實現 鳩佔鵲巢還是功成身退

2021-08-25 01:25:04 字數 2197 閱讀 2982

exec函式可以執行乙個程序,是run-time library裡面的特性,標準上並沒有給出什麼硬性規定,因此各個作業系統平台上就可以有五花八門的實現了,本文介紹linux上的實現鳩佔鵲巢和windows下的實現功成身退。

在linux上,著名的exec函式族可謂是無人不曉,它最著名的特性就是可以實現替換當前程序的位址空間,因此你如果在乙個程序當中執行了exec,那 就不要指望exec返回執行exec呼叫點後面的操作了。exec並不負責建立程序,他只負責替換位址空間,負責建立程序的是由另乙個系統呼叫來承擔,就 是fork,所以在linux中典型的建立新的執行映像的方式就是fork+exec,當然在你不想要當前程序的情況下也可以直接exec。而在 windows下,exec卻是簡單的createprocess+exitprocess的封裝,在windows下一切最終都要落實到 win32api的,因此win32api相當於多出來的乙個層次,而不像linux直接進行系統呼叫完事,從這二者的實現我們可以看出什麼端倪嗎?

凡是用過unix的都知道unix的哲學,每次只做並且做好一件事情這個終極哲學,你看fork,連引數都沒有,就是建立程序,再看exec,根本不管進 程的事,就是替換位址空間,只有這樣,把如何組合的策略交給使用者,使用者才可以獲得最大的自由,從而開發出豐富的應用程式。linux本身是一點策略都不提 供的,它不會幫你做你認為會省力的工作,也就是說,只要是你可以完成的工作它就絕對不插手,比如在不影響當前程序的情況下啟動另乙個程序,linux認為 沒有必要直接提供這樣乙個系統呼叫,這裡的使用者指的是所有系統呼叫層上面的使用者,包括庫的設計者。庫的設計者或者程式設計師使用者可以隨意組合這些現有的系統調 用介面,封裝成更加方便的介面,只可惜作業系統並不會幫你,舉個例子,fork+exec就有乙個封裝函式,叫做system。我們反過來看看 windows的策略,windows為了開發者可以最快的進行開發,另外加上它的核心和使用者空間是比較同步的進行開發的,聯絡非常緊密,兩個空間非常的 了解對方,因此windows往往會直接提供一些策略,這就增加了作業系統和開發者之間的耦合度,不像在linux下開發,系統呼叫介面很穩定,一般不怎 麼變化,核心空間和使用者空間只需要通過這個穩定的介面層通訊就可以了,而且彼此完全可以不了解對方,正如我前一篇文章所說,這種特性帶來的就是術業有專攻

的 龐大社群的支援,力量非常強大。既然windows提供了一些使用者策略,那麼它就明顯不適合unix哲學同樣是建立程序windows的 createprocess函式幾乎為使用者做完了全部的事情,包括建立程序,對映程式映像,這就是和linux的最大不同了。當然並不能說windows 不好,它也有自己的哲學,作為乙個產品,它的開發者深知自己的產品,另外不管是核心還是使用者空間策略都是產品的一部分,因此就沒有必要區分那麼清了,它的 開發者通過會議的方式進行協作,因此他們之間的通訊就不一定要侷限在系統呼叫介面了。

可能有些人會認為windows的exec的方式更加乾淨,確實有那麼一點意思,linux的方式有些羅嗦也有那麼一點意思,可是使用者真的需要這種所謂的 乾淨嗎?那要看使用者是什麼樣的人了,信奉不同哲學的人往往會因為一點小的分歧大開殺戒。事實上linux的exec和windows的exec根本就不是 乙個層面上的,在linux中,exec只是「建立程序」這件事情的「一部分」,而在windows下,exec卻包含了「建立程序」這件事情,但是還不 止這件事情,另外還包括「退出當前程序」這件事情,用一句俗語區分它們就是,在linux中,exec的作用是「鳩佔鵲巢」,在windows 中,exec的作用乙個是「功成」另乙個是「身退」。這裡就可以看出linux和windows的設計粒度,顯然linux更加細化一些,細化的東西組合 起來往往會出現規模效應,功能會很強大,而粗化的東西在擴充套件的時候功能會受到限制,比如linux可以很簡單的實現「功成」+「身退」,就是 fork+exec+exit,其實就是三個只做一件事的系統呼叫之組合,反過來要在windows下實現「鳩佔鵲巢」就不容易了,因此windows中 最細的東西都要比這個「鳩佔鵲巢」要粗,於是就受到了限制。這樣的話,在linux中就可以在保持pid不變的情況下重新啟動自身,而在windows下 這個需求就很難了。

雖然同樣都是exec函式,在linux和windows中的地位卻大不相同,當然其位置也不同,在linux中可以很安心的將之放到系統呼叫門口,因為 它就做一件事,不會有任何***,但是在windows下,它的存在純粹是為了相容標準c,於是就要用win32api來封裝exec函式,而 win32api中卻沒有替換位址空間這麼細粒度的操作,於是乎只好僅僅實現語義,於是最終就有了createprocess+exitprocess的 組合,有人可能會問這不也是乙個組合嗎?是的,這是乙個組合,但是這是由只做一件事的函式作為元素組合的嗎?顯然不是。

exec系列函式的實現

exec系列函式從linux的linux binfmt鍊錶中,通過依次呼叫每個結構的load binary函式來選擇合適的執行格式,一旦找到就執行load binary函式,否則嘗試下乙個linux binfmt的load binary 直到嘗試完所有的linux binfmt。load binar...

execlp使用例子 exec的6種不同使用格式

經過前幾章的了解我們對程序的建立和結束有了了解。那麼我們知道fork函式建立的程序只是將父程序的環境複製到新程序中,而沒有用新程式來初始化建立的子程序,因此,它並不能執行乙個新的目標程式,而這一點又是程式設計時所必須的,為此linux系統提供了exec系統呼叫。exec函式有6種不同的使用格式,但是...

實現點選不同的按鈕載入不同的css

這段時間做乙個小 發現有時候特別需要點選不同的按鈕去載入不同的css,這樣可以確定點選的是哪個,由於每個按鈕都是從後端資料庫載入過來的,不僅是簡簡單單的用id或者是類名,用過this也不行 前端載入的 1 2 a href id a name a books onclick books messag...