版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux進(jìn)程和線程編程,1、Linux中的進(jìn)程相關(guān)概念 2、Linux中的進(jìn)程的創(chuàng)建 3、Linux中的進(jìn)程的管理和守護(hù)進(jìn)程,6.1 進(jìn)程的概述,時(shí)間和空間是計(jì)算機(jī)的兩個(gè)概念,操作系統(tǒng)將者兩個(gè)概念實(shí)現(xiàn)為文件和進(jìn)程。 進(jìn)程是一個(gè)可以獨(dú)立的可有OS調(diào)度的活動(dòng)。 進(jìn)程是一個(gè)抽象實(shí)體,當(dāng)它執(zhí)行的時(shí)候需要OS分配資源。 進(jìn)程是一個(gè)正在執(zhí)行的程序。 進(jìn)程是一個(gè)程序的一次執(zhí)行。 進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進(jìn)程既是基本的分配單元,也是基本的執(zhí)行單元,6.1 進(jìn)程的概述,進(jìn)程的概念主要有兩點(diǎn): 第一,進(jìn)程是一個(gè)實(shí)體。每一
2、個(gè)進(jìn)程都有它自己的地址空間,一般情況下,包括文本區(qū)域(text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)。文本區(qū)域存儲(chǔ)處理器執(zhí)行的代碼;數(shù)據(jù)區(qū)域存儲(chǔ)變量和進(jìn)程執(zhí)行期間使用的動(dòng)態(tài)分配的內(nèi)存;堆棧區(qū)域存儲(chǔ)著活動(dòng)過(guò)程調(diào)用的指令和本地變量。 第二,進(jìn)程是一個(gè)“執(zhí)行中的程序”。程序是一個(gè)沒(méi)有生命的實(shí)體,只有處理器賦予程序生命時(shí),它才能成為一個(gè)活動(dòng)的實(shí)體,我們稱(chēng)其為進(jìn)程。 進(jìn)程是操作系統(tǒng)中最基本、重要的概念。 是多道程序系統(tǒng)出現(xiàn)后,為了刻畫(huà)系統(tǒng)內(nèi)部出現(xiàn)的動(dòng)態(tài)情況,描述系統(tǒng)內(nèi)部各道程序的活動(dòng)規(guī)律引進(jìn)的一個(gè)概念,所有多道程序設(shè)計(jì)操作系統(tǒng)都建立在進(jìn)程的基礎(chǔ)上。 原因原
3、因原因原因 操作系統(tǒng)引入進(jìn)程的概念的原因: 從理論角度看,是對(duì)正在運(yùn)行的程序過(guò)程的抽象; 從實(shí)現(xiàn)角度看,是一種數(shù)據(jù)結(jié)構(gòu),目的在于清晰地刻劃動(dòng)態(tài)系統(tǒng)的內(nèi)在規(guī)律,有效管理和調(diào)度進(jìn)入計(jì)算機(jī)系統(tǒng)主存儲(chǔ)器運(yùn)行的程序。,6.1 .1進(jìn)程的描述,進(jìn)程的種類(lèi) 交互進(jìn)程:由一個(gè)Shell啟動(dòng)的進(jìn)程,交互進(jìn)程既可以在前臺(tái)運(yùn)行,也可以在后臺(tái)運(yùn)行。 批處理進(jìn)程:這種進(jìn)程和終端沒(méi)有聯(lián)系,是一個(gè)進(jìn)程序列。 監(jiān)控進(jìn)程:也稱(chēng)守護(hù)進(jìn)程,Linux系統(tǒng)啟動(dòng)是啟動(dòng)的進(jìn)程,并在后臺(tái)運(yùn)行。 進(jìn)程不但包括程序指令和數(shù)據(jù),還包括程序計(jì)數(shù)器和CPU的所有寄存器及其存儲(chǔ)臨時(shí)數(shù)據(jù)的進(jìn)程堆棧。 Linux是一個(gè)多進(jìn)程O(píng)S,其他進(jìn)程必須等到當(dāng)前正在
4、執(zhí)行的進(jìn)程交出CPU的控制權(quán)后才能被內(nèi)核調(diào)度執(zhí)行。 當(dāng)正在運(yùn)行的進(jìn)程等待其他系統(tǒng)資源時(shí),linux內(nèi)核獲得CPU的控制權(quán),并將CPU分配給其他正在等待的進(jìn)程,內(nèi)核中的調(diào)度算法決定將CPU分配給那個(gè)進(jìn)程。,內(nèi)存是計(jì)算機(jī)的敏感資源,熟練掌握對(duì)內(nèi)存的操作是一個(gè)程序員的必備素質(zhì)。 數(shù)據(jù)的內(nèi)部存儲(chǔ)方式:大小端法 在c中,不同的數(shù)據(jù)類(lèi)型占用的空間是不同的,例如char類(lèi)型占用1個(gè)字節(jié),而int占用4個(gè)字節(jié),6.1 .1進(jìn)程的描述-進(jìn)程內(nèi)存管理-數(shù)據(jù)內(nèi)部存儲(chǔ),時(shí)間和空間是計(jì)算機(jī)的兩個(gè)基本的概念,操作系統(tǒng)將這兩個(gè)概念實(shí)現(xiàn)未進(jìn)程和文件,。 進(jìn)程ID是一個(gè)進(jìn)程的基本屬性,其作用類(lèi)似與人的身份證號(hào),根據(jù)進(jìn)程ID用戶
5、可以精確的定位一個(gè)進(jìn)程,一個(gè)標(biāo)識(shí)符對(duì)應(yīng)于一個(gè)進(jìn)程,多個(gè)進(jìn)程標(biāo)識(shí)符可以對(duì)應(yīng)于一個(gè)程序。進(jìn)程標(biāo)識(shí)符的類(lèi)型是pit_t,他是一個(gè)無(wú)符號(hào)整數(shù)。,6.1 .1進(jìn)程的描述-進(jìn)程標(biāo)識(shí)符進(jìn)程ID,使用PS查看當(dāng)前進(jìn)程 ps -u 用戶名 第一列是進(jìn)程id最后一列是對(duì)應(yīng)的程序名稱(chēng),6.1 .1進(jìn)程的描述-進(jìn)程標(biāo)識(shí)符進(jìn)程ID,Linux操作系統(tǒng)包括三種不同類(lèi)型的進(jìn)程,每種進(jìn)程都有自己的特點(diǎn)和屬性。 交互進(jìn)程由一個(gè)shell啟動(dòng)的進(jìn)程。交互進(jìn)程既可以在前臺(tái)運(yùn)行,也可以在后臺(tái)運(yùn)行(人機(jī)交互)。 批處理進(jìn)程這種進(jìn)程和終端沒(méi)有聯(lián)系,是一個(gè)進(jìn)程序列(多個(gè)進(jìn)程)。 監(jiān)控進(jìn)程(也稱(chēng)守護(hù)進(jìn)程)Linux系統(tǒng)啟動(dòng)時(shí)啟動(dòng)的進(jìn)程,并在
6、后臺(tái)運(yùn)行。,6.1 .1進(jìn)程的描述- Linux 進(jìn)程分類(lèi),運(yùn)行狀態(tài):此時(shí)進(jìn)程或者正在運(yùn)行或者準(zhǔn)備運(yùn)行 等待狀態(tài):此時(shí)進(jìn)程在等待一個(gè)事件的發(fā)生或者某種系統(tǒng)資源 停止?fàn)顟B(tài):此時(shí)進(jìn)程已經(jīng)被終止 死亡狀態(tài):這是一個(gè)停止的進(jìn)程,但是在進(jìn)程向量數(shù)組中占有一個(gè)task_struct結(jié)構(gòu) R (TASK_RUNNING),可執(zhí)行狀態(tài) S (TASK_INTERRUPTIBLE),可中斷的睡眠狀態(tài)。 D (TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態(tài)。 s進(jìn)程的領(lǐng)導(dǎo)者 +前臺(tái)進(jìn)程,6.2 .1 Linux 進(jìn)程運(yùn)行狀態(tài),每一個(gè)進(jìn)程有6個(gè)重要的ID,分別是進(jìn)程ID、父進(jìn)程ID、有效用戶ID、有
7、小組ID、實(shí)際用戶ID和實(shí)際組ID。這六個(gè)ID保存在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)中,有些時(shí)候用戶程序需要用到這些ID。 例如在/proc文件系統(tǒng)下每個(gè)進(jìn)程有一個(gè)目錄,里面存放進(jìn)程的相關(guān)信息,當(dāng)進(jìn)程要讀取這些文件時(shí),應(yīng)該先得到當(dāng)前進(jìn)程的ID才能確定進(jìn)入那一個(gè)進(jìn)程相關(guān)的子目錄,由于這些ID存儲(chǔ)在內(nèi)核之中,因此linux提供一組專(zhuān)門(mén)的接口函數(shù)訪問(wèn)這些ID值。 Linux環(huán)境下使用getpid和getppid函數(shù)獲得進(jìn)程和父進(jìn)程的ID,其函數(shù)原型如下: #include Pid_t getpid(void) pid_t getppid(void) 函數(shù)成功返回進(jìn)程的id ,失敗返回-1,,6.2 .1 Linux
8、 進(jìn)程標(biāo)識(shí)符,Linux環(huán)境下使用getuid和geteuid函數(shù)獲得進(jìn)程用戶ID,其函數(shù)原型如下: #include uid_t getuid(void) uid_t geteuid(void) 函數(shù)成功返回進(jìn)程的用戶id ,失敗返回-1. Linux環(huán)境下使用getgid和getegid函數(shù)獲得進(jìn)程用戶組ID,其函數(shù)原型如下: #include gid_t getgid(void) gid_t getegid(void) 函數(shù)成功返回進(jìn)程的用戶id ,失敗返回-1, Pid_t類(lèi)型參看/usr/include/bits/types.h 實(shí)際就是int類(lèi)型,6.2 .1 Linux 進(jìn)程標(biāo)識(shí)
9、符,每,6.2 .1 Linux 進(jìn)程標(biāo)識(shí)符,啟動(dòng)進(jìn)程和調(diào)度進(jìn)程 1 手動(dòng)啟動(dòng):用戶直接輸入shell命令后回車(chē)直接啟動(dòng)進(jìn)程 前臺(tái)啟動(dòng):用戶輸入一個(gè)shell命令后按回車(chē)就啟動(dòng)給一個(gè)前臺(tái)進(jìn)程 后臺(tái)啟動(dòng):在shell命令后加入一個(gè)“ who,6.2 .2 Linux 進(jìn)程進(jìn)程命令- sleep,kill命令殺掉進(jìn)程 作用:kill命令終止一個(gè)進(jìn)程。 格式:kill -s signal |-p -apid kill -l signal 主要選項(xiàng)如下。 -s:指定發(fā)送的信號(hào)。 -p:模擬發(fā)送信號(hào)。 -l:指定信號(hào)的名稱(chēng)列表。 pid:要終止的進(jìn)程的ID號(hào)。 signal:表示信號(hào)。,6.2 .2 L
10、inux 進(jìn)程進(jìn)程命令- kill,說(shuō)明:kill可將指定的信息送至程序。預(yù)設(shè)的信息為SIGTERM(15),可將指定程序終止。若仍無(wú)法終止該程序,可使用SIGKILL(9)信息嘗試強(qiáng)制刪除程序。kill命令的工作原理是,向Linux系統(tǒng)的內(nèi)核發(fā)送一個(gè)系統(tǒng)操作信號(hào)和某個(gè)程序的進(jìn)程標(biāo)志號(hào),然后系統(tǒng)內(nèi)核就可以對(duì)進(jìn)程標(biāo)志號(hào)指定的進(jìn)程進(jìn)行操作。當(dāng)需要中斷一個(gè)前臺(tái)進(jìn)程的時(shí)候,通常使用Ctrl+C組合鍵;但是對(duì)于一個(gè)后臺(tái)進(jìn)程,就不是一個(gè)組合鍵所能解決的了,這時(shí)就必須使用kill命令。 應(yīng)用實(shí)例如下。 命令執(zhí)行過(guò)程如果出錯(cuò),用戶可用kill來(lái)結(jié)束任務(wù)。對(duì)于在后臺(tái)運(yùn)行的進(jìn)程,可以使用kill命令終止: $ k
11、ill -s 9 1827,6.2 .2 Linux 進(jìn)程進(jìn)程命令- kill,1at命令:定時(shí)運(yùn)行命令 作用:at命令在指定時(shí)刻執(zhí)行指定的命令序列。 # at 2:05 tomorrow at /home/mj/airplane /home/mj/air-safe at Ctrl+D 2crontab命令 作用:crontab命令用于安裝、刪除或者列出用于驅(qū)動(dòng)cron后臺(tái)進(jìn)程的任務(wù)表。然后,該配置由cron守護(hù)進(jìn)程在設(shè)定的時(shí)間執(zhí)行。 格式:crontab -u user 文件,6.2 .2 Linux 進(jìn)程進(jìn)程命令- at,fork() 創(chuàng)建一個(gè)新進(jìn)程 Wake()喚醒一個(gè)進(jìn)程 Schedu
12、le() 進(jìn)程調(diào)度函數(shù) Exit()退出進(jìn)程,6.3.1 Linux 進(jìn)程進(jìn)程函數(shù),6.3.2 Linux 進(jìn)程狀態(tài),睡眠進(jìn)程可以被程序再次的喚醒,而僵死進(jìn)程不會(huì)被任何程序喚醒,只能通過(guò)命令kill掉 深度睡眠和淺度睡眠進(jìn)程得到它需要的資源被喚醒,通過(guò)schedule()進(jìn)入執(zhí)行態(tài),深度睡眠的進(jìn)程不能被信號(hào)或者定時(shí)中斷喚醒,只有它申請(qǐng)的資源又有效是才能被喚醒。 Linux中,僅等待CPU時(shí)間的進(jìn)程稱(chēng)為就緒進(jìn)程,它們被放置在一個(gè)運(yùn)行隊(duì)列中,一個(gè)就緒進(jìn)程的狀態(tài)標(biāo)志位為T(mén)ASK_RUNNING。一旦一個(gè)運(yùn)行中的進(jìn)程時(shí)間片用完, Linux 內(nèi)核的調(diào)度器會(huì)剝奪這個(gè)進(jìn)程對(duì)CPU的控制權(quán),并且從運(yùn)行隊(duì)列中
13、選擇一個(gè)合適的進(jìn)程投入運(yùn)行。 當(dāng)然,一個(gè)進(jìn)程也可以主動(dòng)釋放CPU的控制權(quán)。函數(shù)schedule()是一個(gè)調(diào)度函數(shù),它可以被一個(gè)進(jìn)程主動(dòng)調(diào)用,從而調(diào)度其它進(jìn)程占用CPU。一旦這個(gè)主動(dòng)放棄CPU的進(jìn)程被重新調(diào)度占用 CPU,那么它將從上次停止執(zhí)行的位置開(kāi)始執(zhí)行,也就是說(shuō)它將從調(diào)用schedule()的下一行代碼處開(kāi)始執(zhí)行。 有時(shí)候,進(jìn)程需要等待直到某個(gè)特定的事件發(fā)生,例如設(shè)備初始化完成、I/O 操作完成或定時(shí)器到時(shí)等。在這種情況下,進(jìn)程則必須從運(yùn)行隊(duì)列移出,加入到一個(gè)等待隊(duì)列中,這個(gè)時(shí)候進(jìn)程就進(jìn)入了睡眠狀態(tài)。,6.3.2 Linux 進(jìn)程狀態(tài),Linux中,僅等待CPU時(shí)間的進(jìn)程稱(chēng)為就緒進(jìn)程,它們
14、被放置在一個(gè)運(yùn)行隊(duì)列中,一個(gè)就緒進(jìn)程的狀態(tài)標(biāo)志位為T(mén)ASK_RUNNING。一旦一個(gè)運(yùn)行中的進(jìn)程時(shí)間片用完, Linux 內(nèi)核的調(diào)度器會(huì)剝奪這個(gè)進(jìn)程對(duì)CPU的控制權(quán),并且從運(yùn)行隊(duì)列中選擇一個(gè)合適的進(jìn)程投入運(yùn)行。 當(dāng)然,一個(gè)進(jìn)程也可以主動(dòng)釋放CPU的控制權(quán)。函數(shù)schedule()是一個(gè)調(diào)度函數(shù),它可以被一個(gè)進(jìn)程主動(dòng)調(diào)用,從而調(diào)度其它進(jìn)程占用CPU。一旦這個(gè)主動(dòng)放棄CPU的進(jìn)程被重新調(diào)度占用 CPU,那么它將從上次停止執(zhí)行的位置開(kāi)始執(zhí)行,也就是說(shuō)它將從調(diào)用schedule()的下一行代碼處開(kāi)始執(zhí)行。 有時(shí)候,進(jìn)程需要等待直到某個(gè)特定的事件發(fā)生,例如設(shè)備初始化完成、I/O 操作完成或定時(shí)器到時(shí)等。
15、在這種情況下,進(jìn)程則必須從運(yùn)行隊(duì)列移出,加入到一個(gè)等待隊(duì)列中,這個(gè)時(shí)候進(jìn)程就進(jìn)入了睡眠狀態(tài)。,6.3.2 Linux 進(jìn)程狀態(tài),父子進(jìn)程:除了PID號(hào)為0號(hào)進(jìn)程以外的其他進(jìn)程都是有其他進(jìn)程創(chuàng)建的,創(chuàng)建進(jìn)程的進(jìn)程是父進(jìn)程,被創(chuàng)建的進(jìn)程稱(chēng)為子進(jìn)程。 進(jìn)程是系統(tǒng)中執(zhí)行的基本單位,liunx系統(tǒng)允許任何而一個(gè)用戶創(chuàng)建一個(gè)子進(jìn)程。創(chuàng)建之后,子進(jìn)程存在系統(tǒng)之中,并且獨(dú)立于父進(jìn)程。該子進(jìn)程可以接受系統(tǒng)調(diào)度,可以分配得到系統(tǒng)資源,系統(tǒng)可以檢測(cè)到他的存在,并且賦予他的父進(jìn)程同樣的權(quán)利。 Linux使用fork函數(shù)創(chuàng)建一個(gè)新的進(jìn)程,其函數(shù)原型如下: #include Pid_t fork(void),6.4.1
16、Linux進(jìn)程系統(tǒng)調(diào)用-創(chuàng)建進(jìn)程,Fork函數(shù)不需要參數(shù),返回值是一個(gè)進(jìn)程ID,返回值分為3種。 對(duì)于父進(jìn)程,fork函數(shù)返回新創(chuàng)建子進(jìn)程的ID 對(duì)于子進(jìn)程,fork函數(shù)返回0 如果出錯(cuò)則返回-1 Fork函數(shù)會(huì)創(chuàng)建一個(gè)新的進(jìn)程,并從內(nèi)核中未此進(jìn)程得到一個(gè)新的ID,之后未這個(gè)新進(jìn)程分配內(nèi)存空間,并將父進(jìn)程的進(jìn)程空間代碼的內(nèi)容復(fù)制到子進(jìn)程的進(jìn)程空間中,包括父進(jìn)程的數(shù)據(jù)段和堆棧段,并且和父進(jìn)程共享代碼段。這時(shí)系統(tǒng)各種又多了一個(gè)進(jìn)程,這個(gè)進(jìn)程和父進(jìn)程一模一樣,兩個(gè)進(jìn)程都要接受系統(tǒng)的調(diào)度。,6.4.1 Linux進(jìn)程系統(tǒng)調(diào)用-創(chuàng)建進(jìn)程fork函數(shù),6.4.1 Linux進(jìn)程系統(tǒng)調(diào)用-創(chuàng)建進(jìn)程fork函
17、數(shù),子進(jìn)程完全復(fù)制了父進(jìn)程的地址空間代內(nèi)容,包括對(duì)戰(zhàn)段和數(shù)據(jù)庫(kù)的內(nèi)容,子進(jìn)程并沒(méi)有復(fù)制代碼段,而是和父進(jìn)程公用代碼段。 Fork函數(shù)的出錯(cuò)情況: Fork有兩種情況返回-1 系統(tǒng)中已有太多的進(jìn)程存在了 調(diào)用fork函數(shù)的用戶進(jìn)程太多了 一般情況下系統(tǒng)會(huì)對(duì)進(jìn)程數(shù)目進(jìn)行限制,如果操作系統(tǒng)對(duì)其不加限制,則用戶可以利用這一漏洞攻擊系統(tǒng),6.4.1 Linux進(jìn)程系統(tǒng)調(diào)用-創(chuàng)建進(jìn)程fork函數(shù),由于fork函數(shù)完整的拷貝了父進(jìn)程的整個(gè)地址空間,因此,執(zhí)行速度比較慢,為了加快fork的執(zhí)行速度,在有些liunx中使用vfork函數(shù)。 Vfork函數(shù)產(chǎn)生的子進(jìn)程和父進(jìn)程完全共享地址空間,包括代碼段、數(shù)據(jù)段和
18、堆棧段,子進(jìn)程對(duì)這些共享資源所做的修改,可以影響到父進(jìn)程 Vfork函數(shù)產(chǎn)生的子進(jìn)程一定比父進(jìn)程先運(yùn)行,也就是說(shuō)父進(jìn)程調(diào)用了vfork函數(shù)后會(huì)等待子進(jìn)程運(yùn)行后再運(yùn)行。 Vfork函數(shù)創(chuàng)建新的進(jìn)程,但他不產(chǎn)生父進(jìn)程的副本,他通過(guò)允許父子進(jìn)程可訪問(wèn)相同物理內(nèi)存從而為裝了對(duì)進(jìn)程地址的真實(shí)拷貝,當(dāng)子進(jìn)程需要改變內(nèi)存中的數(shù)據(jù)時(shí)才會(huì)拷貝父進(jìn)程。這就是著名的“寫(xiě)操作時(shí)拷貝”copy-on-write技術(shù),6.4.1 Linux進(jìn)程系統(tǒng)調(diào)用-創(chuàng)建進(jìn)程vfork函數(shù),上面講了進(jìn)程的fork函數(shù),很多人有疑問(wèn)既然所有的進(jìn)程都是fork創(chuàng)建的,那么linux所有的進(jìn)程不就幾乎全部一樣嗎,而且就我們的常識(shí)而言,當(dāng)我們
19、執(zhí)行一個(gè)程序時(shí),新產(chǎn)生的進(jìn)程內(nèi)容就因該是程序的內(nèi)容才對(duì)。 Linux環(huán)境使用exec函數(shù)執(zhí)行一個(gè)新程序,該函數(shù)在文件系統(tǒng)中搜索指定的路徑文件,并將該文件內(nèi)容復(fù)制到調(diào)用的exec函數(shù)地址空間,取代原來(lái)的進(jìn)程內(nèi)容。 Exec函數(shù)提供了一個(gè)在進(jìn)程中啟動(dòng)另一個(gè)程序的方法他可以根據(jù)指定的文件名和目錄找到可執(zhí)行代碼,并用它來(lái)取代原調(diào)用進(jìn)程的數(shù)據(jù)段代碼段和堆棧段,在執(zhí)行之后,遠(yuǎn)調(diào)用進(jìn)程的內(nèi)容中除了進(jìn)程號(hào)以外,其他全部被新的進(jìn)程替換了。 可執(zhí)行文件可以是二進(jìn)制文件也可以是liunx下的腳本文件。,6.4.2 Linux進(jìn)程系統(tǒng)調(diào)用-exec函數(shù),在什么情況下使用exec函數(shù) 當(dāng)有進(jìn)程認(rèn)為自己不能再為系統(tǒng)和用戶
20、作出任何新貢獻(xiàn)了,就可以調(diào)用任何exec函數(shù)族,讓自己以新的面貌重生。 如果一個(gè)進(jìn)程想執(zhí)行另一程序,它就可以調(diào)用fork函數(shù)新建一個(gè)進(jìn)程,然后執(zhí)行任何一個(gè)exec函數(shù),這樣看起來(lái)就像通過(guò)執(zhí)行應(yīng)用程序而產(chǎn)生了一個(gè)新進(jìn)程一樣。,6.4.2 Linux進(jìn)程系統(tǒng)調(diào)用-exec函數(shù),所需頭文件#include int execl(const char *path, const char *arg, .); int execlp(const char *file, const char *arg, .); int execle(const char *path, const char *arg, ., c
21、har *const envp); int execv(const char *path, char *const argv); int execvp(const char *file, char *const argv); int execve(const char *path, char *const argv, char *const envp); 其中只有execve是真正意義上的系統(tǒng)調(diào)用,其它都是在此基礎(chǔ)上經(jīng)過(guò)包裝的庫(kù)函數(shù)。 exec函數(shù)族的函數(shù)執(zhí)行成功后不會(huì)返回,因?yàn)檎{(diào)用進(jìn)程的實(shí)體,包括代碼段,數(shù)據(jù)段和堆棧等都已經(jīng)被新的內(nèi)容取代,只留下進(jìn)程ID等一些表面上的信息仍保持原樣,頗有些神
22、似三十六計(jì)中的金蟬脫殼。看上去還是舊的軀殼,卻已經(jīng)注入了新的靈魂。只有調(diào)用失敗了,它們才會(huì)返回一個(gè)-1,從原程序的調(diào)用點(diǎn)接著往下執(zhí)行。,6.4.2 Linux進(jìn)程系統(tǒng)調(diào)用-exec函數(shù),Execl的第一個(gè)參數(shù)是包含路勁的可執(zhí)行文件,后面是參數(shù)列表,列表的第一個(gè)為命令path,接著為參數(shù)列表,最后必須以null結(jié)束。 Execlp的第一個(gè)參數(shù)可以使用絕對(duì)路徑或者是相對(duì)路徑 Excele最后包含指向一個(gè)自定義環(huán)境變量列表的指針,此列表必須以null結(jié)束。 Execv,v表示path后面接受的是一個(gè)向量,即指向一個(gè)參數(shù)列表的指針,注意這個(gè)列表的最后一項(xiàng)必須是null Execve path后面的接受
23、一個(gè)參數(shù)列表向量,并可以指定一個(gè)環(huán)境變量列表向量 Execvp,第一個(gè)參數(shù)可以使用相對(duì)或者絕對(duì)路徑,v表示后面接受一個(gè)參數(shù)列表向量。,6.4.2 Linux進(jìn)程系統(tǒng)調(diào)用-exec函數(shù),對(duì)于l表示list,說(shuō)明執(zhí)行程序的命令參數(shù)以列表的方式提供,并且用null結(jié)束。參數(shù)的個(gè)數(shù)沒(méi)有限制。如下: Char * arg0 , Char * arg1 , Char * arg2 ,null V表示所有的參數(shù)以指針數(shù)組方式給出,其語(yǔ)法為*const argv,這個(gè)數(shù)組的每一行是一個(gè)命令參數(shù)。 E表示傳遞給新程序的環(huán)境變量列表,這個(gè)列表是一個(gè)數(shù)組,數(shù)組的每一行表示一個(gè)環(huán)境變量,如果沒(méi)有顯示的說(shuō)明環(huán)境變量則新
24、程序繼承父進(jìn)程的環(huán)境變量。 P表示第一參數(shù)不是完整的路徑名,這是就要從環(huán)境變量中讀取環(huán)境變量參數(shù)組合成一個(gè)完整的路徑名。那么exec函數(shù)就會(huì)匹配bin/filename、 usr/bin/filename 直到找到一個(gè)正確路徑,就將該文件加載到內(nèi)存執(zhí)行,如果該文件不存在則,exec函數(shù)出錯(cuò)。,6.4.2 Linux進(jìn)程系統(tǒng)調(diào)用-exec函數(shù),Exec函數(shù)調(diào)用hello程序,使用exec函數(shù)調(diào)用當(dāng)前目錄下的hello程序,Exec函數(shù)調(diào)用ps ef命令,Exec函數(shù)調(diào)用hello程序,帶參數(shù)的程序執(zhí)行 ./helloc1 hello world,Linux 進(jìn)程標(biāo)識(shí)符,#include int main(int argc, char *argv) char *envp=PATH=/tmp, USER=lei, STATUS=testing, NULL; char *argv_execv=echo, excuted by execv, NULL; char *argv_execvp=echo, executed by execvp, NULL; char *argv_execve=env, NULL; if(fork()=0) if(execl(/bin/echo, echo, executed by exe
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能技術(shù)在消費(fèi)品行業(yè)應(yīng)用行動(dòng)方案研究
- 幼兒園安全教育課程設(shè)計(jì)方案
- 企業(yè)創(chuàng)新管理流程和制度范例
- 醫(yī)院患者入院制度
- 舊樓翻新涂料施工工藝方案
- 建筑伸縮縫施工工藝流程方案
- 消防安全臺(tái)賬管理電子化方案
- 幼兒園日常衛(wèi)生管理與監(jiān)督制度
- 糧食節(jié)約活動(dòng)方案與總結(jié)報(bào)告
- XX車(chē)間生產(chǎn)線安全管理制度執(zhí)行與隱患排查考核(2024年度)
- 2026年藥店培訓(xùn)計(jì)劃試題及答案
- 2026春招:中國(guó)煙草真題及答案
- 物流鐵路專(zhuān)用線工程節(jié)能評(píng)估報(bào)告
- 2026河南省氣象部門(mén)招聘應(yīng)屆高校畢業(yè)生14人(第2號(hào))參考題庫(kù)附答案
- 2026天津市南開(kāi)區(qū)衛(wèi)生健康系統(tǒng)招聘事業(yè)單位60人(含高層次人才)備考核心試題附答案解析
- 2025江蘇無(wú)錫市宜興市部分機(jī)關(guān)事業(yè)單位招聘編外人員40人(A類(lèi))備考筆試試題及答案解析
- 卵巢過(guò)度刺激征課件
- 漢服行業(yè)市場(chǎng)壁壘分析報(bào)告
- 2026華潤(rùn)燃?xì)庑@招聘(公共基礎(chǔ)知識(shí))綜合能力測(cè)試題附答案解析
- 九師聯(lián)盟2026屆高三上學(xué)期12月聯(lián)考英語(yǔ)(第4次質(zhì)量檢測(cè))(含答案)
- 第21章 反比例函數(shù)(單元測(cè)試·綜合卷)(含答案)-滬科版(2024)九上
評(píng)論
0/150
提交評(píng)論