重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
這篇文章主要介紹“Linux進(jìn)程的介紹及創(chuàng)建方法”,在日常操作中,相信很多人在Linux進(jìn)程的介紹及創(chuàng)建方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux進(jìn)程的介紹及創(chuàng)建方法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),西市企業(yè)網(wǎng)站建設(shè),西市品牌網(wǎng)站建設(shè),網(wǎng)站定制,西市網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,西市網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
進(jìn)程
首先,我們可以使用$ps命令來查詢正在運行的進(jìn)程,比如$ps -eo pid,comm,cmd,下圖為執(zhí)行結(jié)果:
(-e表示列出全部進(jìn)程,-o pid,comm,cmd表示我們需要PID,COMMAND,CMD信息)
每一行代表了一個進(jìn)程。每一行又分為三列。第一列PID(process IDentity)是一個整數(shù),每一個進(jìn)程都有一個唯一的PID來代表自己的身份,進(jìn)程也可以根據(jù)PID來識別其他的進(jìn)程。第二列COMMAND是這個進(jìn)程的簡稱。第三列CMD是進(jìn)程所對應(yīng)的程序以及運行時所帶的參數(shù)。
(第三列有一些由中括號[]括起來的。它們是內(nèi)核的一部分功能,被打扮成進(jìn)程的樣子以方便操作系統(tǒng)管理。我們不必考慮它們。)
我們看第一行,PID為1,名字為init。這個進(jìn)程是執(zhí)行/bin/init這一文件(程序)生成的。當(dāng) Linux 啟動的時候,init是系統(tǒng)創(chuàng)建的第一個進(jìn)程,這一進(jìn)程會一直存在,直到我們關(guān)閉計算機。這一進(jìn)程有特殊的重要性,我們會不斷提到它。
如何創(chuàng)建一個進(jìn)程
實際上,當(dāng)計算機開機的時候,內(nèi)核(kernel)只建立了一個init進(jìn)程。Linux內(nèi)核并不提供直接建立新進(jìn)程的系統(tǒng)調(diào)用。剩下的所有進(jìn)程都是init進(jìn)程通過fork機制建立的。新的進(jìn)程要通過老的進(jìn)程復(fù)制自身得到,這就是fork。fork是一個系統(tǒng)調(diào)用。進(jìn)程存活于內(nèi)存中。每個進(jìn)程都在內(nèi)存中分配有屬于自己的一片空間 (address space)。當(dāng)進(jìn)程fork的時候,Linux在內(nèi)存中開辟出一片新的內(nèi)存空間給新的進(jìn)程,并將老的進(jìn)程空間中的內(nèi)容復(fù)制到新的空間中,此后兩個進(jìn)程同時運行。
老進(jìn)程成為新進(jìn)程的父進(jìn)程(parent process),而相應(yīng)的,新進(jìn)程就是老的進(jìn)程的子進(jìn)程(child process)。一個進(jìn)程除了有一個PID之外,還會有一個PPID(parent PID)來存儲的父進(jìn)程PID。如果我們循著PPID不斷向上追溯的話,總會發(fā)現(xiàn)其源頭是init進(jìn)程。所以說,所有的進(jìn)程也構(gòu)成一個以init為根的樹狀結(jié)構(gòu)。
如下,我們查詢當(dāng)前shell下的進(jìn)程:
class="">root@vamei:~# ps -o pid,ppid,cmd PID PPID CMD16935 3101 sudo -i16939 16935 -bash33774 16939 ps -o pid,ppid,cmd
我們可以看到,第二個進(jìn)程bash是第一個進(jìn)程sudo的子進(jìn)程,而第三個進(jìn)程ps是第二個進(jìn)程的子進(jìn)程。
還可以用$pstree命令來顯示整個進(jìn)程樹:
class="">init─┬─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─accounts-daemon───{accounts-daemon} ├─acpid ├─apache2─┬─apache2 │ └─2*[apache2───26*[{apache2}]] ├─at-spi-bus-laun───2*[{at-spi-bus-laun}] ├─atd ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─colord───2*[{colord}] ├─console-kit-dae───64*[{console-kit-dae}] ├─cron ├─cupsd───2*[dbus] ├─2*[dbus-daemon] ├─dbus-launch ├─dconf-service───2*[{dconf-service}] ├─dropbox───15*[{dropbox}] ├─firefox───27*[{firefox}] ├─gconfd-2 ├─geoclue-master ├─6*[getty] ├─gnome-keyring-d───7*[{gnome-keyring-d}] ├─gnome-terminal─┬─bash │ ├─bash───pstree │ ├─gnome-pty-helpe │ ├─sh───R───{R} │ └─3*[{gnome-terminal}]
fork通常作為一個函數(shù)被調(diào)用。這個函數(shù)會有兩次返回,將子進(jìn)程的PID返回給父進(jìn)程,0返回給子進(jìn)程。實際上,子進(jìn)程總可以查詢自己的PPID來知道自己的父進(jìn)程是誰,這樣,一對父進(jìn)程和子進(jìn)程就可以隨時查詢對方。
通常在調(diào)用fork函數(shù)之后,程序會設(shè)計一個if選擇結(jié)構(gòu)。當(dāng)PID等于0時,說明該進(jìn)程為子進(jìn)程,那么讓它執(zhí)行某些指令,比如說使用exec庫函數(shù)(library function)讀取另一個程序文件,并在當(dāng)前的進(jìn)程空間執(zhí)行 (這實際上是我們使用fork的一大目的: 為某一程序創(chuàng)建進(jìn)程);而當(dāng)PID為一個正整數(shù)時,說明為父進(jìn)程,則執(zhí)行另外一些指令。由此,就可以在子進(jìn)程建立之后,讓它執(zhí)行與父進(jìn)程不同的功能。
子進(jìn)程的終結(jié)(termination)
當(dāng)子進(jìn)程終結(jié)時,它會通知父進(jìn)程,并清空自己所占據(jù)的內(nèi)存,并在內(nèi)核里留下自己的退出信息(exit code,如果順利運行,為0;如果有錯誤或異常狀況,為>0的整數(shù))。在這個信息里,會解釋該進(jìn)程為什么退出。父進(jìn)程在得知子進(jìn)程終結(jié)時,有責(zé)任對該子進(jìn)程使用wait系統(tǒng)調(diào)用。這個wait函數(shù)能從內(nèi)核中取出子進(jìn)程的退出信息,并清空該信息在內(nèi)核中所占據(jù)的空間。但是,如果父進(jìn)程早于子進(jìn)程終結(jié),子進(jìn)程就會成為一個孤兒(orphand)進(jìn)程。孤兒進(jìn)程會被過繼給init進(jìn)程,init進(jìn)程也就成了該進(jìn)程的父進(jìn)程。init進(jìn)程負(fù)責(zé)該子進(jìn)程終結(jié)時調(diào)用wait函數(shù)。
當(dāng)然,一個糟糕的程序也完全可能造成子進(jìn)程的退出信息滯留在內(nèi)核中的狀況(父進(jìn)程不對子進(jìn)程調(diào)用wait函數(shù)),這樣的情況下,子進(jìn)程成為僵尸(zombie)進(jìn)程。當(dāng)大量僵尸進(jìn)程積累時,內(nèi)存空間會被擠占。
進(jìn)程與線程(thread)
盡管在UNIX中,進(jìn)程與線程是有聯(lián)系但不同的兩個東西,但在Linux中,線程只是一種特殊的進(jìn)程。多個線程之間可以共享內(nèi)存空間和IO接口。所以,進(jìn)程是Linux程序的唯一的實現(xiàn)方式。
到此,關(guān)于“Linux進(jìn)程的介紹及創(chuàng)建方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
當(dāng)前名稱:Linux進(jìn)程的介紹及創(chuàng)建方法
標(biāo)題來源:http://www.xueling.net.cn/article/goghcd.html