![](/img/trans.png)
[英]How many Shared Libraries at max can we link it to a application in C and in linux?
[英]how many ways we can create a process in linux using c
我在Linux中創建進程時感到困惑。 到目前為止,我認為我們可以通過調用以下系統調用來創建進程。
system()
exec()
系列調用 fork()
系統調用 但:
system():但是當“系統”系統調用執行shell和shell上的輸入可執行文件時,正在創建一個子進程來執行輸入。所以shell調用子進程然后我們可以說fork正在為此創建進程。
exec系統調用:當這個系統調用時,用新進程寫入當前正在運行的進程。因此它也創建了一個新進程但使用相同的地址空間。 我認為它也在調用call fork來創建進程。
我很困惑以上事實是創建新進程或只有fork系統的可能方法。
系統調用的exec
系列不會調用fork
,也不會創建新的進程。 它只用新二進制文件覆蓋現有進程。
在linux
用戶程序中, fork
是創建新進程的唯一函數。 雖然fork
內部調用clone
和其他系統調用。
在另一方面, system
只是fork
和exec
的包裝器。 創建進程的實際任務是通過fork
in system
完成的。 因此system
不是創建新流程的方法。
fork()
創建進程的副本。 這是您在像Linux這樣的POSIX環境中實際創建進程的地方。 要准確回答您的問題標題, fork()
是創建流程的唯一方法。
exec()
為你做的是用另一個進程替換一個進程(例如你剛用fork()
創建的進程exec()
,所以exec()
本身不會創建一個進程,但通常會附帶fork()
,因為您通常希望創建另一個與當前流程不同的流程。
在system()
調用下面,只有一個fork()
后跟一個exec()
,所以它不是創建進程的新方法。
在POSIX環境中,您可以通過fork
系統調用創建一個進程,沒有任何異常。 Fork將創建一個進程。
exec
系列函數只是將其他程序的二進制加載到當前進程的地址空間(調用exec()系統調用)。
在system()
它在內部使用fork()
然后是exec()
系統調用。
創建新進程的方法只有兩種:系統調用fork
和clone
。
提到的其他功能分為兩類:
exec()
系列:它們用其他程序替換進程的內容。 通常在調用fork
或clone
之后立即使用exec()
將其中一個結果進程轉換為所需應用程序的進程。 例如,當bash
執行gcc
命令時,它首先會自行分配,然后使用exec()
系列將兩個結果bash
進程中的一個進入gcc
進程。
system()
系列:這些封裝了一個fork
/ clone
系統調用和一個相應的exec()
調用,可能會做一些奇特的事情,如連接stdin
和stdout
等。
請注意,所有這些函數fork()
, clone()
, exec()
, system()
等都是由標准C庫(始終存在)定義的系統調用包裝器,而不是系統調用自身。 因此,違反直覺, fork()
是當前系統上clone
系統調用的包裝器。 這並不重要。 但是,C庫函數是標准化的,系統調用不是。
從歷史上看, fork
是較舊的系統調用。 雖然定義和使用其語義非常容易,但它總是受到其性能影響:整個過程環境需要(至少在邏輯上)被復制,但是,大部分工作都是無用的,作為最終的過程之一通常被exec
調用完全覆蓋。 此外, fork
語義不允許創建線程。 由於這些缺點,引入了clone
調用,它允許對復制的內容進行細粒度控制,以及在兩個進程之間共享的內容,允許以clone
方式實現pthreads
。
除了所有其他答案,並且挑剔,進程由fork(2) (或過時的vfork(2) ...)和clone(2)系統調用創建(並且不, execve(2)系統調用不創建進程,但通過在同一進程中啟動一個新程序來覆蓋其地址空間和狀態),但某些進程是由內核“神奇地”創建的,特別是:
/sbin/init
在啟動時由內核啟動(如果沒有找到,則嘗試其他一些程序,甚至是/bin/sh
....); 這是pid 1的過程是很早就開始了...
一些內核進程(或內核線程)由內核啟動,如kswapd , kworker
(請參閱此問題)等...我有超過50個內核進程或任務
Linux內核有時也會從內核啟動用戶進程,特別是hotplug(8) , modprobe等...另請參閱udev等...
幾乎所有進程都是由fork
(或clone
...)啟動的,並且是/sbin/init
(或pid 1的進程)的后代。 (但是modprobe
或hotplug
可以由內核啟動,它們通常會fork
其他進程)。
進程創建(通過fork
等......)非常有效。 shell正在分配幾乎所有命令(除了內置的命令,如cd
或ulimit
......); clone
是多線程所必需的(但可以用來代替fork
......)
請注意, system(3) , popen(3)是庫函數 (不是系統調用 ,在syscalls(2)中列出...)調用fork
和execve
(在/bin/sh
...上)和該守護進程( 3)是一個庫函數調用fork
(兩次)等...
使用strace(1) (找出程序正在執行的系統調用)並閱讀高級Linux編程
這些天,最近的Libc使用clone
而不是fork
(有些人不再調用fork
系統調用,而只是clone
); 你可以有幾個libc,例如GNU libc的補充(或替代)的MUSL libc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.