⑴ linux創建進程 pid
你用了pthread庫,在鏈接的時候要加上
gcc -lpthread 1.c -o 1
即可
子進程(對應pid==0語句)調用pthread介面創建線程,在縣城內將value賦值5,然後列印 CHILD: value=%d\n 此時value = 5
父進程 (對應 pid > 0 語句),等待子進程執行完成後(wait語句),列印PARENT: value=%d\n ,此時value = 0
對於你補充問題的回答:
線程是在子進程里創建的,它只改變了子進程的value (子進程和父進程的value處在不同的地址空間,互相沒有關系,而子進程和它所創建的線程是在同一地址空間,所以線程可以改變子進程的value), 父進程沒有創建線程,因此它的值不會被改變。
⑵ 在LINUX環境下如何創建一個新的進程
使用fork系統調用可以創建一個進程,fork之後可以調用exec介面用來執行新進程的代碼。
建議看看《UNIX高級環境編程》。
⑶ linux進程由什麼函數創建創建過程中內核為其所提供的服務過程
用fork函數創建 內核把原來程序的代碼段和數據段復制到新的進程中
⑷ Linux啟動一個進程的過程
Linux 中的每個進程都存在於「進程樹」中。你可以通過運行 pstree 命令查看進程樹。樹的根是 init,進程號是 1。每個進程(init 除外)都有一個父進程,一個進程都可以有很多子進程。
所以,假設我要啟動一個名為 ls 的進程來列出一個目錄。我是不是只要發起一個進程 ls 就好了呢?不是的。
我要做的是,創建一個子進程,這個子進程是我(me)本身的一個克隆,然後這個子進程的「腦子」被吃掉了,變成 ls。
開始是這樣的:
然後運行 fork(),生成一個子進程,是我(me)自己的一份克隆:
然後我讓該子進程運行 exec("ls"),變成這樣:
當 ls 命令結束後,我幾乎又變回了我自己:
在這時 ls 其實是一個僵屍進程。這意味著它已經死了,但它還在等我,以防我需要檢查它的返回值(使用 wait 系統調用)。一旦我獲得了它的返回值,我將再次恢復獨自一人的狀態。
上文提到的「腦子被吃掉」是什麼意思呢?
進程有很多屬性:
當你運行 execve 並讓另一個程序吃掉你的腦子的時候,實際上幾乎所有東西都是相同的! 你們有相同的環境變數、信號處理程序和打開的文件等等。
唯一改變的是,內存、寄存器以及正在運行的程序,這可是件大事。
為何 fork 並非那麼耗費資源(寫入時復制)
你可能會問:「如果我有一個使用了 2GB 內存的進程,這是否意味著每次我啟動一個子進程,所有 2 GB 的內存都要被復制一次?這聽起來要耗費很多資源!」
事實上,Linux 為 fork() 調用實現了寫時復制 on write,對於新進程的 2GB 內存來說,就像是「看看舊的進程就好了,是一樣的!」。然後,當如果任一進程試圖寫入內存,此時系統才真正地復制一個內存的副本給該進程。如果兩個進程的內存是相同的,就不需要復制了
當子進程終結時,它會通知父進程,並清空自己所佔據的內存,並在內核里留下自己的退出信息(exit code,如果順利運行,為0;如果有錯誤或異常狀況,為>0的整數)。在這個信息里,會解釋該進程為什麼退出。父進程在得知子進程終結時,有責任對該子進程使用wait系統調用。這個wait函數能從內核中取出子進程的退出信息,並清空該信息在內核中所佔據的空間。但是,如果父進程早於子進程終結,子進程就會成為一個孤兒(orphand)進程。孤兒進程會被過繼給init進程,init進程也就成了該進程的父進程。init進程負責該子進程終結時調用wait函數。
當然,一個糟糕的程序也完全可能造成子進程的退出信息滯留在內核中的狀況(父進程不對子進程調用wait函數),這樣的情況下,子進程成為僵屍(zombie)進程。當大量僵屍進程積累時,內存空間會被擠占。
⑸ linux怎樣創建進程
你是玩軟體還是編程
編程的話方法很多:調用fork,system等.
⑹ linux是怎樣創建進程的
這個說起來太復雜了。不是一句兩句的。LINUX創建進程和WINDOWS創建進程機制很大程度上是相同的。不同點在於。內核對信息處理次序優先順序會發生歧義。一般都是輸入系統發出信息後,通過匯流排送到CPU處理,這是CPU就會給預處理和正在處理的數據編號。形成一個進程。然後再通過匯流排將數據傳回到輸出系統。這個真不是一句兩句能說明白的。恐怕我一晚上也解釋不明白。要想很好的理解,就不要去管什麼操作系統了。所有操作系統都一樣。直接看微機組成原理吧!網上很多電子書。你把這塊懂了。相信以後的匯編編程也就好弄點。
祝你好運。