




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章進程控制本章重點進程的基本概念及進程的結構Linux環境下進程的相關函數的應用守護進程的概念、啟動和建立進程控制程序的編寫26.1進程簡介進程是一個程序的一次執行的過程。在Linux環境下,每個正在運行的程序都稱為進程。每個進程包含進程標識符及數據,這些數據包含進程變量、外部變量及進程堆棧等。1.進程與程序由于一個進程對應一個程序的執行,但進程不等同于程序。因為程序是靜態的概念,進程是動態的概念。進程是程序執行的過程,包括了動態創建、調度和消亡的整個過程。進程是程序執行和資源管理的最小單位。對系統而言,當用戶在各級系統中鍵入命令執行一個程序的時候,它將啟動一個進程,因此,一個程序可以對應多個進程。36.1進程簡介2.Linux環境下的進程管理Linux環境下的進程管理包括啟動進程和調度進程。啟動進程有兩種主要途徑:手工啟動和調度啟動。(1)手工啟動又可分為前臺啟動和后臺啟動。前臺啟動:是手工啟動一個進程的最常用方式。一般地,當用戶輸入一個命令時,就已經啟動了一個進程,并且是一個前臺的進程。后臺啟動:往往是在該進程非常耗時,且用戶也不急著需要結果的時候啟動。一般地,當用戶輸入一個命令結尾加上一個“&”號,就是后臺啟動一個進程。46.1進程簡介(2)調度啟動有時系統需要進行一些比較費時而且占用資源的維護工作,并且這些工作適合在深夜無人職守的時候進行,這時用戶就可以事先進行調度安排,指定任務運行的時間或者場合,到時候系統就會自動完成這一切工作。56.1進程簡介調度進程包括對進程的中斷操作、改變優先級、查看進程狀態等。Linux環境下常見的進程調用命令66.2Liunx進程控制Linux環境下在進程啟動時,系統會分配一個唯一的數值給每個進程,這個數值就稱為進程標識符。在Linux中最主要的進程標識有進程號(PID)和它的父進程號(PPID)。PID惟一地標識一個進程。PID和PPID都是非零的正整數。在Linux中獲得當前進程的PID和PPID的系統調用函數為getpid和getppid函數。76.2Liunx進程控制例6-1:設計一個程序,要求顯示Linux系統分配給此程序的進程號(PID)和它的父進程號(PPID)。源程序代碼:多次運行例6.1的程序,每一次運行的結果PID值都是不一樣的,所以說PID是惟一地標識一個進程。86.2Liunx進程控制getpid函數說明getppid函數說明96.2.1進程的相關函數Linuxc與進程相關的主要函數10進進程程創創建建1.exec函函數數例6-2::設計計一一個個程程序序,,程程序序在在運運行行時時,,能能執執行行vim程程序序,,即即創創建建一一個個新新的的進進程程,,并并用用ps命命令令查查看看程程序序的的進進程程號號與與vim的的進進程程號號。。源程序代代碼:11進進程創建建編譯、運運行程序序,系統統會出現現運行結結果,先先顯示Linux系統統分配的的進程號號(PID),,接著運運行vim程序序,創建建新的進進程。再打開一一個終端端,用ps查看看原進程程和新創創建進程程的進程程號(PID)。可以看到到,在新新進程創創建后,,原來的的進程已已經終止止了。在用execve函數數創建新新進程后后,會以以新的程程序取代代原來的的進程,,然后系系統會從從新進程程運行,,但是新新進程的的PID值會與與原來進進程的PID值值相同。。一般情情況下,,在運行行execve函數后后是不會會返回原原進程的的,只有有在錯誤誤時才會會返回-1,所所以在原原進程中中的execve函數數下方,,加入perror函函數,輸輸出錯誤誤信息,,并返回回1,表表示有錯錯誤發生生。注意::在使使用exec族族時,,一定定要加加上錯錯誤判判斷語語句,,因為為exec很容容易執執行失失敗。。12進進程創創建實際上上,在在Linux中中并沒沒有exec函函數,,而是是有6個以以exec開頭頭的函函數族族。exec函函數族族的6個成成員函函數的的語法法事實上上,這這6個個函數數中真真正的的系統統調用用只有有execve,其其他5個都都是庫庫函數數,它它們最最終都都會調調用execve這這個系系統調調用。。136.2.2進程創創建思考題1::execv函數的的應用,要要在程序中中執行命令令:ps-ef,命令ps在"/bin"目目錄下。在在這一函數數中,參數數v表示參參數傳遞(含命令)為構造指指針數組方方式:char*arg[]={"ps","-ef",NULL};函數的使用用為:execv("/bin/ps",arg);參考程序::#include<stdio.h>/*文件預處處理,包含含標準輸入入輸出庫*/#include<unistd.h>/*文件預處處理,包含含getpid、getppid函數數庫*/intmain()/*C程序的的主函數,,開始入口口*/{char*arg[]={"ls","-al",NULL};execv("/bin/ls",arg);return1;}146.2.2進程創創建思考題2::execlp函函數的應用用,要在程程序中執行行命令:ps-ef,命令令ps在"/bin"目錄下下。在這一一函數中,,參數l表表示命令或或參數逐個個列舉,參參數p為文文件查找方方式(不需需要給出路路徑)。因因而此函數數的調用形形式為:execlp("ps","ps","-ef",NULL);請編寫一程程序進行調調試。思考題3::execl函數數的應用,,要在程序序中執行命命令:ps-ef,命令ps在"/bin"目錄下。。在這一函函數中,參參數l表示示命令或參參數逐個列列舉,文件件需給定路路徑。因而而此函數的的調用形式式為:execl("/bin/ps","ps","-ef",NULL);請編寫一程程序進行調調試。156.2.2進程創創建2.system函數system函數是是一個和操操作系統緊緊密相關的的函數。用用戶可以使使用它在自自己的程序序中調用系系統提供的的各種命令令。使用時不需需要預處理理頭文件““unistd.h”。例6-3::設計一個程程序,要求求測試到LUPA社社區的網絡絡連通狀況況。編輯源程序序代碼:166.2.2進程創創建編譯、運行行程序,系系統會出現現運行結果果,先顯示示Linux系統分分配的進程程號(PID),接接著運行ping程程序,創建建新的進程程。再打開一個個終端,用用ps查看看原進程和和新創建進進程的進程程號(PID)。。可以看到,,原來6-3的進程程(PID)值和和新進程的的父進程號號(PPID)值相相同,在新新進程創建建后,原來來的進程并并沒有終止止。注意:在第第二個終端端的時候,,第一個終終端中的ping不不能結束。。176.2.2進程創創建system函數說說明186.2.2進程創創建3.fork函數數使用fork函數創創建進程時時,新的進進程叫子進進程,原來來調用fork函數數的進程則則稱為父進進程。子進程會復復制父進程程的數據和和堆棧空間間,并繼承承父進程的的用戶代碼碼、組代碼碼、環境變變量、已經經打開的文文件代碼、、工作目錄錄及資源限限制等,但但是子進程程和父進程程使用不同同的內存空空間。196.2.2進程創創建例6-4::設計一個程程序,要求求先顯示當當前目錄下下的文件信信息,然后后測試到LUPA社社區的網絡絡連通狀況況。編輯源程序序代碼206.2.2進程創創建編譯、運行行程序,觀觀察結果。。可以看到,,使用fork函數數創建了一一個子進程程,子進程程的返回值值是0,父父進程的返返回值是子子進程的進進程號(PID)。。而子進進程的父進進程號(PPID)和父進程程的進程號號(PID)相同。。可見,子進進程由父進進程派生出出來。注意:fork函數數使用一次次就創建一一個進程,,所以若把把fork函數放在在ifelse判斷語句句或for循環語句句中則要小小心,不能能多次使用用fork函數。如:voidmain(){for(;;)fork();}21進進程創建sleep函函數說明fork函數數說明22進進程創建思考題:此例例中,為什么么用sleep等待10秒鐘?思考題:設計計一個程序,,在子進程中中調用函數execl("/bin/ps","ps","-ef",NULL),而在父父進程中調用用函數execle("/bin/env","env",NULL,envp),其中有有定義:char*envp[]={"PATH=/tmp","USER=liu",NULL};請編寫并進行行調試。23進進程終止濫用fork函數會占滿滿系統進程,,而且子進程程與父進程使使用不同的內內存空間,不不斷產生子進進程,也可能能讓系統資源源消耗殆盡。。Linux環環境下c終止止進程主要用用exit和和_exit函數。例6-5:設計一個程序序,要求子進進程和父進程程都在顯示輸輸出一些文字字后分別用exit和_exit函函數終止進程程。編輯源程序代代碼:觀察結果可以以看出,調用用exit函函數時,緩沖沖區中的記錄錄能正常輸出出;而調用_exit時時,緩沖區中中的記錄無法法輸出。24進進程終止_exit()函數作用用:直接使進進程停止運行行,清除其使使用的內存空空間,并清除除其在內核中中的各種數據據結構;exit()函數則在執執行退出之前前加了若干道道工序,exit函數在在調用exit系統之前前要查看文件件的打開情況況,把文件緩緩沖區中的內內容寫回文件件。25進進程終止exit函數數說明_exit函函數說明26僵僵尸進程一個僵尸進程程(zombie),是是指已終止運運行,但尚末末被清除的進進程,又稱為為過渡進程。。當使用fork函數創建建子進程時,,由于子進程程有可能比父父進程晚終止止,父進程終終止后,子進進程還沒終止止,子進程就就成了僵尸進進程。為避免免這種情況,,可以在父進進程中調用wait或waitpid函數。wait函函數數是是用用于于使使父父進進程程阻阻塞塞,,直直到到一一個個子子進進程程終終止止或或者者該該進進程程接接到到了了一一個個指指定定的的信信號號為為止止。。waitpid的的作作用用和和wait一一樣樣,,但但它它并并不不一一定定要要等等待待第第一一個個終終止止的的子子進進程程,,它它還還有有若若干干選選項項,,也也能能支支持持作作業業控控制制。。實際際上上wait函函數數只只是是waitpid函函數數的的一一個個特特例例,,在在Linux內內部部實實現現wait函函數數時時直直接接調調用用的的就就是是waitpid函函數數。。27僵僵尸尸進進程程例6-6::設計計一一個個程程序序,,要要求求復復制制進進程程,,子子進進程程顯顯示示自自己己的的進進程程號號(PID)后后暫暫停停一一段段時時間間,,父父進進程程等等待待子子進進程程正正常常結結束束,,打打印印顯顯示示等等待待的的進進程程號號(PID)和和等等待待的的進進程程退退出出狀狀態態。。流程圖圖:28僵僵尸進進程編輯源源程序序代碼碼:此例中中的子子進程程運行行時間間,明明顯比比父進進程時時間長長。為為了避避免子子進程程成為為僵尸尸進程程,父父進程程調用用wait,阻阻塞父父進程程的運運行,,等待待子進進程正正常結結束,,父進進程才才繼續續運行行,直直到正正常結結束。。296.2.4僵尸進進程wait函函數說明306.2.4僵尸進進程例6-7::設計一個程程序,要求求用戶可以以選擇是否否復制進程程,子進程程模仿思科科(Cisco)1912交交換機的開開機界面,,以命令行行的方式讓讓用戶選擇擇進入,父父進程判斷斷子進程是是否正常終終止。流程圖:316.2.4僵尸進進程編輯源程序序代碼:326.2.4僵尸進進程編譯、運行行程序,提提示是否復復制進程,,先選擇““2.不復復制進程””,此時沒沒有產生子子進程,返返回值為““0”。。再次運行程程序后,選選擇“1.復制進程程”,此時時產生子進進程,子進進程的功能能是模擬交交換機的開開機界面,,提示選擇擇畫面,這這兒選擇0,進入子子程序display0,等等待子程序序運行終止止后,返回回值為“1”,父進進程才終止止。修改程序::不用waitpid函數。。再次運行程程序后,選選擇“1.復制進程程”,這時時候父進程程沒有等待待子進程,,也就是在在模擬顯示示完交換機機的開機界界面后,根根本沒來得得及輸入選選擇,父進進程就終止止了,子進進程就變成成了僵尸進進程。此例可以看看出,在沒沒有語法、、語義等錯錯誤的情況況下,程序序還是沒有有完成設計計要求。可可見,在多多進程程序序設計時,,除了養成成使用完后后就終止的的良好習慣慣,還要讓讓子進程工工作完成后后再終止,,這個時候候父進程就就得靈活使使用wait函數和和waitpid函函數。336.2.4僵尸進進程waitpid函數數說明346.3Linux守護進程程守護進程((Daemon)是是運行在后后臺的一種種特殊進程程。守護進程獨獨立于控制制終端并且且周期性地地執行某種種任務或等等待處理某某些發生的的事件。守護進程是是一種很有有用的進程程。Linux的大大多數服務務器就是用用守護進程程實現的。。同時,守守護進程程完成許許多系統統任務。。35守守護進程程及其特特性守護進程程最重要要的特性性是后臺臺運行。。其次,守守護進程程必須與與其運行行前的環環境隔離離開來。。這些環環境包括括未關閉閉的文件件描述符符,控制制終端,,會話和和進程組組,工作作目錄以以及文件件創建掩掩碼等。。這些環環境通常常是守護護進程從從執行它它的父進進程(特特別是shell)中中繼承下下來的。。最后,守守護進程程的啟動動方式有有其特殊殊之處。。它可以以在Linux系統啟啟動時從從啟動腳腳本/etc/rc.d中啟啟動,也也可以由由作業規規劃進程程crond啟啟動,還還可以由由用戶終終端(通通常是shell)執執行。36守守護進程程及其特特性通過ps–aux命命令可查查看Linux環境下下的守護護進程::Init系統守守護進程程:它是是進程1,負責責啟動各各運行層層次特定定的系統統服務。。Keventd守護進進程:為為在內核核中運行行計劃執執行的函函數提供供進程上上下文。。Kswapd守守護進程程:也稱稱為頁面面調出守守護進程程。它通通過將臟臟頁面以以低速寫寫到磁盤盤上從而而使這些些頁面在在需要時時仍可回回收使用用,這種種方式支支持虛存存子系統統。bdflush和kupdated守護進進程:Linux內核核使用兩兩個守護護進程bdflush和kupdated將調整整緩存中中的數據據沖洗到到磁盤上上。當可可用內存存達到下下限時,,bdflush守護護進程將將臟緩沖沖區從緩緩沖池中中沖洗到到磁盤上上,每隔隔一定時時間間隔隔,kupdated守護進進程將臟臟頁面沖沖洗到磁磁盤上,,以便在在系統失失效時減減少丟失失的數據據。37守守護進程程及其特特性portmap端口映映射守護護進程::提供將將RPC(遠程程過程調調用)程程序號映映射為網網絡端口口號的服服務。syslogd守護進進程:可可由幫助助操作人人員把系系統消息息記入日日志的任任何程序序使用。。inetd守護護進程((xinetd):它它偵聽系系統網絡絡接口,,以便取取得來自自網絡的的對各種種網絡服服務進程程的請求求。nfsd、lockd、rpciod守護護進程::提供對對網絡文文件系統統(NFS)的的支持持。cron守護進進程:在在指定的的日期和和時間執執行指定定的命令令。許多多系統管管理任務務是由cron定期地地執行相相關程序序而實現現的。cupsd守護護進程::是打印印假脫機機進程,,它處理理對系統統提出的的所有打打印請求求。注意:大大多數守守護進程程都以超超級用戶戶(用戶戶ID為為0)特特權運行行。沒有有一個守守護進程程具有控控制終端端,其終終端名設設置為問問號(??)。38編編寫守護護進程的的要點39編編寫守護護進程的的要點(1)創創建子進進程,終終止父進進程pid=fork();if(pid>0){exit(0);}/*終止父父進程*/(2)在在子進程程中創建建新會話話setsid函函數用于于創建一一個新的的會話,,并擔任任該會話話組的組組長,其其作用::讓進程擺擺脫原會會話的控控制;讓進程擺擺脫原進進程組的的控制;;讓進程擺擺脫原控控制終端端的控制制。而setsid函數能能夠使進進程完全全獨立出出來,從從而脫離離所有其其他進程程的控制制。40編編寫守護護進程的的要點(3)改改變工作作目錄改變工作作目錄的的常見函函數是chdir。(4)重重設文件件創建掩掩碼文件創建建掩碼是是指屏蔽蔽掉文件件創建時時的對應應位。把文件創創建掩碼碼設置為為0,可可以大大大增強該該守護進進程的靈靈活性。。設置文件件創建掩掩碼的函函數是umask。41編編寫守護護進程的的要點(5)關關閉文件件描述符符通常按如如下方式式關閉文文件描述述符:for(i=0;i<NOFILE;i++)close(i);或者也可可以用如如下方式式:for(i=0;i<MAXFILE;i++)close(i);42守守護進程程的編寫寫例6-8:設計兩個個程序,,主程序序6-8.c和和初始化化程序init.c。。要求主主程序每每隔十秒秒鐘向/tmp目錄中中的日志志6-8.log報告告運行狀狀態。初初始化程程序中的的init_daemon函函數負責責生成守守護進程程。43守守護進程程的編寫寫編輯源程程序代碼碼:注意:這這里的fopen函數數必須具具有root權權限。如如果沒有有root權限限,可以以看到守守護進程程的運行行,但不不會在文文件里寫寫入任何何字符。。44守守護進程的的編寫編譯、運行文文件后,沒有有任何提示,,等待一段時時間后,查看看一下6-8.log文件中有沒沒有文字寫入入,輸入“tail-f/tmp/6-8.log”,顯示示多條文字,,從時間上看看,說明守護護進程在暗地地里每隔10秒寫入一串串字符。用ps命令查查看進程。可見,6-8確實一直在在運行,而且且看到“?””結合Linux環境下下進程的知識識,知道確實實有了一個守守護進程。注意:父進程程創建了子進進程,而父進進程又退出之之后,此時該該子進程就變變成了“孤兒兒進程”。在在Linux中,每當系系統發現一個個孤兒進程,,就會自動由由1號進程((也就是init進程))收養它,原原先的子進程程就會變成init進程程的子進程了了。45守守護進程的的編寫setsid函數說明:思考題:此例中如果不不先終止父進進程,就調用用setsid函數會發發生什么?守守護進程運行行后,注消當當前用戶后再再登錄進去,,守護進程還還在運行嗎??編寫一程序,,要求運行后后成為守護進進程,每隔5分鐘修改一一次本機的IP地址。46守守護進程的的編寫例6-9:設計兩個程序序,要求運行行后成為守護護進程,守護護進程又復制制出一個子進進程,守護進進程和它的子子進程都調用用syslog函數,把把結束前的狀狀態寫入系統統日志文件。。流程圖:47守守護進程的的編寫編輯源程序代代碼:注意:調用openlog、syslog函數數,操作的系系統日志文件件“/var/log/message”,必必須具有root權限。。48守守護進程的的編寫編譯、運行程程序后,沒有有任何提示,,等待一段時時間后,查看看一下/var/log/messages文文件中有沒有有文字寫入,,輸入“tail-f/var/log/messages”,此時時,顯示多條條文字,說明明守護進程通通過系統日志志管理服務,,在暗地里寫寫入一串字符符,而且從時時間上看出,,第二子進程程確實是在暫暫停5秒鐘后后退出的。用ps命令查查看進程。。可見,6-9確實一直在在運行,而且且看到“?””結合Linux環境下下進程的知識識,知道確實實有了一個守守護進程。49守守護進程的的編寫openlog函數說明明syslog函數說明思考題:編寫寫一程序,要要求運行后成成為守護進程程,復制守護護進程的子進進程,子進程程往某個文件件里寫入字符符串“測試守守護進程”,,守護進程的的錯誤信息輸輸出到系統日日志文件“/var/log/messages”,程序序以普通用戶戶權限編譯后后運行調試會會有什么結果果?
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳統手工藝體驗工坊企業制定與實施新質生產力項目商業計劃書
- 圖形認知訓練卡片企業制定與實施新質生產力項目商業計劃書
- 化妝創新創業項目商業計劃書
- 古典藝術品修復與復制行業深度調研及發展項目商業計劃書
- 河北萬卷文化課件下載
- 云計算性能服務行業跨境出海項目商業計劃書
- 2025年中國針織毛紗線市場調查研究報告
- 2025年中國干式大蒜脫皮機市場調查研究報告
- 2024年度浙江省二級注冊建筑師之建筑結構與設備每日一練試卷B卷含答案
- 車輛銷售公司股權轉讓與電商渠道合作合同
- 全麻期間氣道梗阻的預防與處理
- 工業大數據的安全與隱私保護-洞察闡釋
- 搬運裝卸服務外包項目投標方案(技術方案)
- 2025年安全月主要責任人講安全課件三:安全月主題宣講課件
- 病原微生物識別技巧試題及答案
- 綠植移植合同協議
- 2024-2025學年高中中國航天日班會 課件 弘揚航天精神 逐夢星辰大海
- 膠質瘤術后護理查房
- 縫紉初步知識培訓課件
- 不穩定型心絞痛護理診斷及護理措施
- 年中國金骨蓮膠囊市場分析及發展策略研究預測報告
評論
0/150
提交評論