資源描述:
《LINUX環(huán)境編程-進(jìn)程編程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、LINUX應(yīng)用編程–進(jìn)程篇2009年12月22日LINUX應(yīng)用編程-進(jìn)程篇HTTP協(xié)議HTML語(yǔ)言CGI編程2進(jìn)程編程–進(jìn)程與程序程序是一個(gè)包含可執(zhí)行代碼的文件,它放在磁盤(pán)等介質(zhì)上。當(dāng)程序被操作系統(tǒng)裝載到內(nèi)存并分配給它一定資源后,此時(shí)可稱為進(jìn)程。為方便操作系統(tǒng)管理,每個(gè)進(jìn)程都會(huì)有一個(gè)唯一的非負(fù)整數(shù)編號(hào)。程序是一個(gè)靜態(tài)概念,進(jìn)程是一個(gè)動(dòng)態(tài)概念。3進(jìn)程編程–內(nèi)存空間Linux的虛擬地址空間也為0~4G,Linux將整個(gè)4G線性地址空間分為用戶空間和內(nèi)核空間兩部分,最高的1G字節(jié)(從虛擬地址0xC00
2、00000到0xFFFFFFFF),供內(nèi)核使用,稱為“內(nèi)核空間”。而將較低的3G字節(jié)(從虛擬地址0x00000000到0xBFFFFFFF),供各個(gè)進(jìn)程使用,稱為“用戶空間)。因?yàn)槊總€(gè)進(jìn)程可以通過(guò)系統(tǒng)調(diào)用進(jìn)入內(nèi)核,因此,Linux內(nèi)核由系統(tǒng)內(nèi)的所有進(jìn)程共享。于是,從具體進(jìn)程的角度來(lái)看,每個(gè)進(jìn)程可以擁有4G字節(jié)的虛擬空間。當(dāng)進(jìn)程陷入內(nèi)核時(shí),內(nèi)核代表進(jìn)程運(yùn)行。4進(jìn)程編程–進(jìn)程描述進(jìn)程描述符:當(dāng)進(jìn)程產(chǎn)生時(shí)有Linux操作系統(tǒng)分配。內(nèi)存:用來(lái)存放進(jìn)程要執(zhí)行的代碼和使用的數(shù)據(jù)。文件描述符:進(jìn)程運(yùn)行時(shí)打開(kāi)的
3、文件。認(rèn)證信息:用戶和組ID進(jìn)程執(zhí)行環(huán)境:各種環(huán)境變量資源安排:CPU時(shí)間進(jìn)程狀態(tài)5進(jìn)程編程–進(jìn)程狀態(tài)用戶狀態(tài):進(jìn)程在用戶狀態(tài)下運(yùn)行的狀態(tài)。內(nèi)核狀態(tài):進(jìn)程在內(nèi)核狀態(tài)下運(yùn)行的狀態(tài)。內(nèi)存中就緒:進(jìn)程沒(méi)有執(zhí)行,但處于就緒狀態(tài),只要內(nèi)核調(diào)度它,就可以執(zhí)行。內(nèi)存中睡眠:進(jìn)程正在睡眠并且進(jìn)程存儲(chǔ)在內(nèi)存中,沒(méi)有被交換到SWAP設(shè)備。就緒且換出:進(jìn)程處于就緒狀態(tài),但是必須把它換入內(nèi)存,內(nèi)核才能再次調(diào)度它進(jìn)行運(yùn)行。睡眠且換出:進(jìn)程正在睡眠,且被換出內(nèi)存。被搶先:進(jìn)程從內(nèi)核狀態(tài)返回用戶狀態(tài)時(shí),內(nèi)核搶先于它,做了上下
4、文切換,調(diào)度了另一個(gè)進(jìn)程。原先這個(gè)進(jìn)程就處于被搶先狀態(tài)。創(chuàng)建狀態(tài):進(jìn)程剛被創(chuàng)建。該進(jìn)程存在,但既不是就緒狀態(tài),也不是睡眠狀態(tài)。這個(gè)狀態(tài)是除了進(jìn)程0以外的所有進(jìn)程的最初狀態(tài)。僵死狀態(tài)(zombie):進(jìn)程調(diào)用exit結(jié)束,進(jìn)程不再存在,但在進(jìn)程表項(xiàng)中仍有紀(jì)錄,該紀(jì)錄可由父進(jìn)程收集。6進(jìn)程編程–進(jìn)程狀態(tài)及轉(zhuǎn)換圖如下:7進(jìn)程調(diào)度原理圖8進(jìn)程編程–進(jìn)程的布局棧用來(lái)存放局部變量和函數(shù)的返回地址。地址從高到低生長(zhǎng)。堆是一塊連續(xù)的內(nèi)存,有低地址向高地址生長(zhǎng)。需要程序在運(yùn)行時(shí)動(dòng)態(tài)申請(qǐng)和釋放。數(shù)據(jù)段存放了程序運(yùn)行
5、時(shí)的各種數(shù)據(jù)。代碼段存放了可執(zhí)行指令,一般為只讀。9進(jìn)程編程–進(jìn)程的環(huán)境變量環(huán)境變量和命令行參數(shù)都放在進(jìn)程的高地址。環(huán)境變量可用environ來(lái)引用。以name=string的形式存放。#include#include#includeexternchar**environ;intmain(intargc,char**argv){inti=0;for(i=0;environ[i];i++){printf("%s",environ[
6、i]);}return0;}10進(jìn)程編程–EXIT系統(tǒng)調(diào)用系統(tǒng)調(diào)用exit的功能是終止發(fā)出調(diào)用的進(jìn)程。它的聲明格式如下:#includevoidexit(intstatus);#includevoid_exit(intstatus);系統(tǒng)調(diào)用_exit立即終止發(fā)出調(diào)用的進(jìn)程。所有屬于該進(jìn)程的文件描述符都關(guān)閉。該進(jìn)程的所有子進(jìn)程由進(jìn)程1(進(jìn)程init)接收,并對(duì)該進(jìn)程的父進(jìn)程發(fā)出一個(gè)SIGCHLD(子進(jìn)程僵死)的信號(hào)。參數(shù)status作為退出的狀態(tài)值返
7、回父進(jìn)程,該值可以通過(guò)系統(tǒng)調(diào)用wait來(lái)收集。返回狀態(tài)碼status只有最低一個(gè)字節(jié)有效。如果進(jìn)程是一個(gè)控制終端進(jìn)程,則SIGHUP信號(hào)將被送往該控制終端的前臺(tái)進(jìn)程。系統(tǒng)調(diào)用_exit從不返回任何值給發(fā)出調(diào)用的進(jìn)程;也不刷新I/O緩沖,如果要自動(dòng)完成刷新,可以用函數(shù)調(diào)用exit。exit為glibc庫(kù)函數(shù),它會(huì)先運(yùn)行注冊(cè)函數(shù),也有可能會(huì)進(jìn)行文件流的關(guān)閉操作,之后再調(diào)用_exit系統(tǒng)調(diào)用。11進(jìn)程編程–RETURN退出進(jìn)程return的返回值就是進(jìn)程終止時(shí)的返回狀態(tài)。如果return沒(méi)有返回任何值
8、,進(jìn)程的返回狀態(tài)是什么?在gcc加–std=c99編譯選項(xiàng)下,進(jìn)程返回狀態(tài)又是什么?C99:是ISO組織在99年新制定的c標(biāo)準(zhǔn),使C更可靠。分別用gccmain.c和gccmain.c–std=c99編譯,觀察返回值。12進(jìn)程編程–進(jìn)程終止處理函數(shù)Atexit()函數(shù)用于注冊(cè)一個(gè)進(jìn)程正常終止時(shí)要調(diào)用的函數(shù),一個(gè)進(jìn)程最多可注冊(cè)32個(gè)終止處理函數(shù)。#includeintatexit(void(*function)(void));成功返回0,失敗返回非0。參數(shù)為函數(shù)指針,此函數(shù)會(huì)在