導航:首頁 > 操作系統 > linux中的exec

linux中的exec

發布時間:2025-02-22 21:05:55

『壹』 為什麼linux下要把創建進程分為fork()和exec()(一系列函數

Fork最早可追溯至1962年Melvin E. Conway的論文《A Multiprocessor System Design》,在這篇論文中,Conway提出Fork和Join兩個並行原語,Fork用於分叉,Join用於聚集。在那篇文章中,Process一詞與當前的「進程」概念並不相同。隨後,GENIE分時系統實現了這一處理邏輯。

exec的起源源自早期Unix中Shell的運行方式。在啟動用戶程序時,Shell會直接將用戶程序代碼覆蓋自身代碼並清空內存,待執行完畢後,使用exit()重新初始化Shell代碼。這樣一來,運行用戶進程前後Shell幾乎無法保留任何信息。(這與80年代的家用電腦情況類似……DOS的INT 21/4B在處理COM時也大致相同。)

為解決這一問題,最簡單的辦法是將Shell的內存空間完全復制一遍再覆蓋,Unix借鑒了GENIE分時系統中的Fork機制來完成此復制任務,這就形成了fork-exec二件套的由來。

『貳』 linux的exec是什麼意思

前三個和最後一個是兩個類型。前三個主要是Linux用來創建新的進程(線程)而設計的,exec()系列函數則是用來用指定的程序替換當前進程的所有內容。所以exec()系列函數經常在前三個函數使用之後調用,來創建一個全新的程序運行環境。Linux用init進程啟動其他進程的過程一般都是這樣的。下面說fork、vfork和clone三個函數。這三個函數分別調用了sys_fork、sys_vfork、sys_clone,最終都調用了do_fork函數,差別在於參數的傳遞和一些基本的准備工作不同。可見這三者最終達到的最本質的目的都是創建一個新的進程。在這里需要明確一下,Linux內核中沒有獨立的「線程」結構,Linux的線程就是輕量級進程,換言之基本控制結構和Linux的進程是一樣的(都是通過struct task_struct管理)。fork是最簡單的調用,不需要任何參數,僅僅是在創建一個子進程並為其創建一個獨立於父進程的空間。fork使用COW(寫時拷貝)機制,並且COW了父進程的棧空間。vfork是一個過時的應用,vfork也是創建一個子進程,但是子進程共享父進程的空間。在vfork創建子進程之後,父進程阻塞,直到子進程執行了exec()或者exit()。vfork最初是因為fork沒有實現COW機制,而很多情況下fork之後會緊接著exec,而exec的執行相當於之前fork復制的空間全部變成了無用功,所以設計了vfork。而現在fork使用了COW機制,唯一的代價僅僅是復制父進程頁表的代價,所以vfork不應該出現在新的代碼之中。在Linux的manpage中隊vfork有這樣一段話:It is rather unfortunate that Linux revived this specter from the past. The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are implemented. Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."clone是Linux為創建線程設計的(雖然也可以用clone創建進程)。所以可以說clone是fork的升級版本,不僅可以創建進程或者線程,還可以指定創建新的命名空間(namespace)、有選擇的繼承父進程的內存、甚至可以將創建出來的進程變成父進程的兄弟進程等等。clone和fork的調用方式也很不相同,clone調用需要傳入一個函數,該函數在子進程中執行。此外,clone和fork最大不同在於clone不再復制父進程的棧空間,而是自己創建一個新的。關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html

『叄』 linux中system和exec函數的區別

system是用shell來調用程序=fork+exec+waitpid,而exec是直接讓你的程序代替用來的程序運行。
system 是在單獨的進程中執行命令,完了還會回到你的程序中。而exec函數是直接在你的進程中執行新的程序,新的程序會把你的程序覆蓋,除非調用出錯,否則你再也回不到exec後面的代碼,就是說你的程序就變成了exec調用的那個程序了。
看一下,下面的例子.
例子1
---------------------------------
system("your_program");
printf("You can see me! ");
---------------------------------
例子2
---------------------------------
exec("your_program");
printf("You can't see me! ");
---------------------------------
在例子1中,在你的程序執行完畢以後,會執行printf語句。
在例子2中,由於exec將程序your_program代替了本身,因此程序不再會執行printf語句。
在Linux下,exec通常會和fork語句一起用。
看下面的這個例子
--------------------------------------------
pid_t pid = fork();
if (pid < 0) {
printf(「fork error!」);
exit(-1);
} else if (pid == 0) {
//這里是子進程
printf("I'm son! ");
//執行其它的程序
exec("your_program");
} else {
//這里是父進程
printf("i'm father!");
wait();//等待子進程結束後返回
exit(0);
}

閱讀全文

與linux中的exec相關的資料

熱點內容
高德地圖解壓後的文件 瀏覽:636
php加水印類 瀏覽:224
編譯原理定義表格和編寫查找函數 瀏覽:349
指數函數和對數函數的高精度快速演算法 瀏覽:207
c預編譯干什麼 瀏覽:24
hp網路共享文件夾 瀏覽:365
程序員如何不被廢 瀏覽:806
二進制流轉pdf 瀏覽:916
php判斷爬蟲 瀏覽:571
960除24除4簡便演算法 瀏覽:786
關於解壓英語翻譯 瀏覽:565
python控制鍵盤右鍵 瀏覽:921
php沒有libmysqldll 瀏覽:829
時政新聞app哪個好 瀏覽:906
手機已加密怎麼辦 瀏覽:201
安卓手機截屏怎麼傳到蘋果 瀏覽:529
京管家app哪裡下載 瀏覽:33
文件夾橫向排列的豎向排列 瀏覽:454
51單片機驅動攝像頭模塊 瀏覽:689
政府文件加密沒法轉換 瀏覽:374