簡體   English   中英

我們可以使用c在linux中創建進程的方法有多少

[英]how many ways we can create a process in linux using c

我在Linux中創建進程時感到困惑。 到目前為止,我認為我們可以通過調用以下系統調用來創建進程。

  1. system()
  2. exec()系列調用
  3. fork()系統調用

但:

  1. system():但是當“系統”系統調用執行shell和shell上的輸入可執行文件時,正在創建一個子進程來執行輸入。所以shell調用子進程然后我們可以說fork正在為此創建進程。

  2. exec系統調用:當這個系統調用時,用新進程寫入當前正在運行的進程。因此它也創建了一個新進程但使用相同的地址空間。 我認為它也在調用call fork來創建進程。

我很困惑以上事實是創建新進程或只有fork系統的可能方法。

系統調用的exec系列不會調用fork ,也不會創建新的進程。 它只用新二進制文件覆蓋現有進程。

linux用戶程序中, fork是創建新進程的唯一函數。 雖然fork內部調用clone和其他系統調用。

在另一方面, system只是forkexec的包裝器。 創建進程的實際任務是通過fork in system完成的。 因此system不是創建新流程的方法。

fork()創建進程的副本。 這是您在像Linux這樣的POSIX環境中實際創建進程的地方。 要准確回答您的問題標題, fork()是創建流程的唯一方法。

exec()為你做的是用另一個進程替換一個進程(例如你剛用fork()創建的進程exec() ,所以exec()本身不會創建一個進程,但通常會附帶fork() ,因為您通常希望創建另一個與當前流程不同的流程。

system()調用下面,只有一個fork()后跟一個exec() ,所以它不是創建進程的新方法。

在POSIX環境中,您可以通過fork系統調用創建一個進程,沒有任何異常。 Fork將創建一個進程。

exec系列函數只是將其他程序的二進制加載到當前進程的地址空間(調用exec()系統調用)。

system()它在內部使用fork()然后是exec()系統調用。

創建新進程的方法只有兩種:系統調用forkclone

提到的其他功能分為兩類:

  1. exec()系列:它們用其他程序替換進程的內容。 通常在調用forkclone之后立即使用exec()將其中一個結果進程轉換為所需應用程序的進程。 例如,當bash執行gcc命令時,它首先會自行分配,然后使用exec()系列將兩個結果bash進程中的一個進入gcc進程。

  2. system()系列:這些封裝了一個fork / clone系統調用和一個相應的exec()調用,可能會做一些奇特的事情,如連接stdinstdout等。

請注意,所有這些函數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的過程是很早就開始了...

  • 一些內核進程(或內核線程)由內核啟動,如kswapdkworker (請參閱問題)等...我有超過50個內核進程或任務

  • Linux內核有時也會從內核啟動用戶進程,特別是hotplug(8)modprobe等...另請參閱udev等...

  • 幾乎所有進程都是由fork (或clone ...)啟動的,並且是/sbin/init (或pid 1的進程)的后代。 (但是modprobehotplug可以由內核啟動,它們通常會fork其他進程)。

進程創建(通過fork等......)非常有效。 shell正在分配幾乎所有命令(除了內置的命令,如cdulimit ......); clone是多線程所必需的(但可以用來代替fork ......)

請注意, system(3)popen(3)庫函數 (不是系統調用 ,在syscalls(2)中列出...)調用forkexecve (在/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM