freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第四章linux進(jìn)程控制-展示頁

2024-10-10 12:36本頁面
  

【正文】 機(jī)制, LINUX同樣支持。同一函數(shù)如若登記多次,則也被調(diào)用多次。 其中, atexit的參數(shù)是一個(gè)函數(shù)地址,當(dāng)調(diào)用此函數(shù)時(shí)無需向它傳送任何參數(shù),也不期望它返回一個(gè)值。 atexit() 按照 ANSI C的規(guī)定,一個(gè)進(jìn)程可以登記多至 32個(gè)函數(shù),這些函數(shù)將由 exit自動(dòng)調(diào)用。 —— 實(shí)例 system ? system將參數(shù) string傳遞給一個(gè)命令解釋器 (一般為 /bin/sh)執(zhí)行 , 即 string被解釋為一條命令 , 由 sh執(zhí)行該命令 .若參數(shù) string為一個(gè)空指針則為檢查命令解釋器是否存在 。 一般,fork后立即調(diào)用 exec,可以最少限度減少空間復(fù)制操作。; ——執(zhí)行程序,顯示與 id命令一樣的結(jié)果 rwxrwxrx 1 zjt zjt 11585 Mar 25 11:38 uid=1028,euid=1028 3. $su – root; ——進(jìn)入根用戶 chmod +s ; chown root 。 ? 例 :編譯核心代碼為下面的程序 ,形成目標(biāo)代碼 printf(uid=%d,euid=%d\n,getuid(),geteuid())。如果新程序的該位已設(shè)置,則有效用戶 ID變成程序文件所有者的 ID,否則有效用戶 ID不變。最后,字母 e表示該函數(shù)取 e nvp[ ] 數(shù)組,而不使用當(dāng)前環(huán)境。字母 l表示該函數(shù)取一個(gè)參數(shù)列表,它與字母 v互斥。函數(shù)名中的字符會(huì)給我們一些幫助。 int execvp(const char *file, char *const argv[])。 int execve(const char *path, char *const argv [], char *const envp[])。 int execv(const char *path, char *const argv[])。其他四個(gè)函數(shù)則使用調(diào)用進(jìn)程中的 environ變量為新程序復(fù)制現(xiàn)存的環(huán)境。 ?最后一個(gè)區(qū)別與向新程序傳遞環(huán)境表相關(guān)。這種參數(shù)表以空指針結(jié)尾。當(dāng)指定 filename作為參數(shù)時(shí):如果 filename中包含 /,則就將其視為路徑名;否則就按 PATH環(huán)境變量,在有關(guān)目錄中搜尋可執(zhí)行文件 ?第二個(gè)區(qū)別與參數(shù)表的傳遞有關(guān) ( l表示列表, v表示矢量 )。如果有進(jìn)程試圖修改這些區(qū)域,則內(nèi)核為有關(guān)部分,典型的是虛存系統(tǒng)中的 “ 頁 ” ,做一個(gè)拷貝。作為替代,使用了在寫時(shí)復(fù)制 ( CopyOnWrite, COW)的技術(shù)(注意不包括??臻g) 。( 2)系統(tǒng)內(nèi)存不足,這時(shí) errno的值被設(shè)置為 ENOMEM。其他一些庫函數(shù),如 system(),實(shí)際上也在內(nèi)部調(diào)用了 fork。 LINUX用戶標(biāo)識(shí) 相應(yīng)的每一個(gè)用戶也有一個(gè)用戶 getuid可以得到進(jìn)程的所有者的 ,而 Linux對(duì)系統(tǒng)資源是進(jìn)行保護(hù)的 ,為了獲取一定資源進(jìn)程還有一個(gè)有效用戶 ID和系統(tǒng)的資源使用有關(guān) ,涉及到進(jìn)程的權(quán)限 . 通過系統(tǒng)調(diào)用 geteuid我們可以得到進(jìn)程的有效用戶 ID. 和用戶 ID相對(duì)應(yīng)進(jìn)程還有一個(gè)組 ID和有效組 ID系統(tǒng)調(diào)用 getgid和getegid可以分別得到組 ID和有效組 ID 創(chuàng)建子進(jìn)程- fork fork( ) 系統(tǒng)調(diào)用創(chuàng)建一個(gè)新的進(jìn)程 , 叫子進(jìn)程 , 是調(diào)用進(jìn)程的一個(gè)復(fù)制品 . 調(diào)用進(jìn)程叫父進(jìn)程 。 /*獲得調(diào)用進(jìn)程的 ID號(hào) */ pid_t getppid(void)。 PCB中包含了很多重要的信息,其中最重要的進(jìn)程 ID( process ID)了,在我們最常使用的 X86架構(gòu)上,其變化范圍是 032767 ?一個(gè)或多個(gè)進(jìn)程可以合起來構(gòu)成一個(gè)進(jìn)程組( process group),一個(gè)或多個(gè)進(jìn)程組可以合起來構(gòu)成一個(gè)會(huì)話( session)。 正確理解進(jìn)程和程序的關(guān)系。第四章 LINUX進(jìn)程控制 UNIX進(jìn)程簡(jiǎn)介 ?進(jìn)程的定義:進(jìn)程是可并發(fā)執(zhí)行的程序在一個(gè)數(shù)據(jù)集合上的運(yùn)行過程。 進(jìn)程的概念理解的核心:運(yùn)行過程的理解,包括運(yùn)行過程中的不同狀態(tài)的理解。 ?在 UNIX中,每個(gè)進(jìn)程在創(chuàng)建時(shí)都會(huì)被分配一個(gè)數(shù)據(jù)結(jié)構(gòu),稱為進(jìn)程控制塊(簡(jiǎn)稱 PCB)。 進(jìn)程號(hào) includesys/ /* 提供類型 pid_t的定義 */ include /* 提供函數(shù)的定義 */ pid_t getpid(void)。 /*獲得調(diào)用者父進(jìn)程的 ID號(hào) */ ?程序的標(biāo)識(shí)是程序名或文件名; ?進(jìn)程的標(biāo)識(shí)就是進(jìn)程號(hào),進(jìn)程號(hào)建立了 進(jìn)程和用戶之間的聯(lián)系。 返回值 : 調(diào)用成功則對(duì)子進(jìn)程返回 0, 對(duì)父進(jìn)程返回子進(jìn)程號(hào) , 這也是最方便的區(qū)分父子進(jìn)程的方法 . 若調(diào)用失敗則返回 1給父進(jìn)程 ,不生成子進(jìn)程 . Fork繼承信息 fork() 的子進(jìn)程繼承了父進(jìn)程的幾乎所有的屬 性 , 包括 : ? 進(jìn)程空間及其內(nèi)容 ? 實(shí)際 UID,GID和有效 UID,GID, 附加 GID ? 環(huán)境變量 . ? 調(diào)用 exec()時(shí)的關(guān)閉標(biāo)志 . ? UID設(shè)置模式比特位 . ? GID設(shè)置模式比特位 . ? 進(jìn)程組號(hào) , 會(huì)話 ID, 控制終端 . ? 當(dāng)前工作目錄 , 根目錄 . ? 文件創(chuàng)建掩碼 UMASK. ? 文件長(zhǎng)度限制 ULIMIT. ? 預(yù)定值 , 如優(yōu)先級(jí)和任何其他的進(jìn)程預(yù)定參數(shù) , 根據(jù)種類不同決定是否可以繼承 . ? 還有一些其它屬性 . Fork后子進(jìn)程的不同信息 子進(jìn)程也有與父進(jìn)程不同的屬性包括 : ? 進(jìn)程號(hào) , 子進(jìn)程號(hào)不同與任何一個(gè)活動(dòng)的進(jìn)程組號(hào) . ? 父進(jìn)程號(hào) . ? 子進(jìn)程繼承父進(jìn)程的文件描述符或流時(shí) , 具有自己的一個(gè)拷貝 ? 并且與父進(jìn)程和其它子進(jìn)程共享該資源 . ? 子進(jìn)程的用戶時(shí)間和系統(tǒng)時(shí)間被初始化為 0. ? 子進(jìn)程的超時(shí)時(shí)鐘設(shè)置為 0. ? 子進(jìn)程的信號(hào)處理函數(shù)指針組置為空 . ? 子進(jìn)程不繼承父進(jìn)程的記錄鎖 . 關(guān)于 fork的說明 ?在 Linux中,創(chuàng)造新進(jìn)程的方法只有一個(gè),就是 fork。 ?fork出錯(cuò)可能有兩種原因:( 1)當(dāng)前的進(jìn)程數(shù)已經(jīng)達(dá)到了系統(tǒng)規(guī)定的上限,這時(shí) errno的值被設(shè)置為 EAGAIN。 —— 示例參考正文 CopyOnWrite的技術(shù)介紹 ?fork的實(shí)現(xiàn)并不做一個(gè)父進(jìn)程數(shù)據(jù)段和堆的完全拷貝,因?yàn)樵?fork之后經(jīng)常跟隨著 exec。這些區(qū)域由父、子進(jìn)程共享, fork時(shí)內(nèi)核將它們的存取許可權(quán)改變?yōu)橹蛔x。 Exec-替換進(jìn)程映象 ?第一個(gè)區(qū)別是前四個(gè)取路徑名作為參數(shù),后兩個(gè)則取文件名作為參數(shù)。函數(shù) execl、execlp和 execle要求將新程序的每個(gè)命令行參數(shù)都說明為一個(gè)單獨(dú)的參數(shù)。對(duì)于另外三個(gè)函數(shù) (execve, execvp和execve),則應(yīng)先構(gòu)造一個(gè)指向各參數(shù)的指針數(shù)組,然后將該數(shù)組地址作為這三個(gè)函數(shù)的參數(shù)。以 e結(jié)尾的兩個(gè)函數(shù)( execle和 execve)可以傳遞一個(gè)指向環(huán)境字符串指針數(shù)組的指針。 include int execl(const char *path, const char *arg, ...)。 int execle(const char *path, const char *arg , ..., char * const envp[])。 int execlp(const char *file, const char *arg, ...)。 Exec的六個(gè)函數(shù)差異 這六個(gè) exec函數(shù)的參數(shù)很難記憶。字母 p表示該函數(shù)取 filename作為參數(shù),并且用PATH環(huán)境變量尋找可執(zhí)行文件。 v表示該函數(shù)取一個(gè)參數(shù)數(shù)組argv[ ]。下圖顯示了這六個(gè)函數(shù)之間的區(qū)別 Exec函數(shù)使用說明(一) ?Exec的基本實(shí)現(xiàn)思想 ?exec新進(jìn)程還繼承原進(jìn)程的如下屬性 : 附加 GID、 進(jìn)程號(hào) 、 父進(jìn)程號(hào) 、 進(jìn)程組號(hào) 、 會(huì)話號(hào) 、 控制終端 、alarm時(shí)鐘信號(hào)剩下的時(shí)間 、 當(dāng)前工作目錄 、 根目錄 、 文件創(chuàng)建掩碼 、 資源限制 、 用戶時(shí)間 、 系統(tǒng)時(shí)間 、 子進(jìn)程用戶時(shí)間 、子進(jìn)程系統(tǒng)時(shí)間 、 記錄鎖 、 進(jìn)程信號(hào)掩碼 、 信號(hào)屏蔽 、 優(yōu)先級(jí) 、 預(yù)定值 . ?在調(diào)用這些系統(tǒng)調(diào)用前打開的文件指針對(duì)新進(jìn)程來說也是打開的 ,除非它已定義了 closeonexec標(biāo)志 .打開的文件指針在新進(jìn)程中保持不變 ,所有相關(guān)的文件鎖也被保留 .調(diào)用進(jìn)程設(shè)置并正被捕俘的信號(hào)在新進(jìn)程中被恢復(fù)為缺省設(shè)置 ,其它的則保持不變 .新進(jìn)程啟動(dòng)時(shí)按文件的 SUID和 SGID設(shè)置定義文件的 UID和 GID為有效 UID和 GID. Exec函數(shù)使用說明(二) ? 在 exec前后實(shí)際用戶 ID和實(shí)際組 ID保持不變,而有效 ID是否改變則取決于所執(zhí)行程序的文件的設(shè)置 用戶 ID位和設(shè)置 組 ID位是否設(shè)置。對(duì)組 ID的處理方式與此相同。 1. $ id——查看當(dāng)前用戶 uid和 gid uid=1028(zjt) gid=1028(zjt) groups=1028(zjt) 2. $ ls –l 。exit ——改變用戶執(zhí)行時(shí) uid和 gid,設(shè)置用戶的 owner為根并退出根用戶 4. $ ls –l ——重新顯示程序執(zhí)行權(quán)限 rwsrwsrx 1 root zjt 11585 Mar 25 11:38 5. $ ——執(zhí)行程序,發(fā)現(xiàn)程序的 euid已經(jīng)改變 uid=1028,euid=0 Exec函數(shù)使用說明(三) ? Linux調(diào)用 exec的兩個(gè)時(shí)機(jī) ? 每當(dāng)有進(jìn)程認(rèn)為自己不能為系統(tǒng)和用戶做出任何貢獻(xiàn)了,就可以調(diào)用任何一個(gè) exec; ? 或者一個(gè)進(jìn)程想執(zhí)行另一個(gè)程序,它就可以 fork出一個(gè)新進(jìn)程,然后 立即 調(diào)用任何一個(gè) exec,這樣看起來就好像通過執(zhí)行應(yīng)用程序而產(chǎn)生了一個(gè)新進(jìn)程一樣。 ? 常見錯(cuò)誤 ? 找不到文件或路徑,此時(shí) errno被設(shè)置為 ENOENT; ? 數(shù)組 argv和 envp忘記用 NULL結(jié)束,此時(shí) errno被設(shè)置為EFAULT; ? 沒有對(duì)要執(zhí)行文件的運(yùn)行權(quán)限,此時(shí) errno被設(shè)置為EACCES。 該命令可以同命令行命令相同形式 , 但由于命令做為一個(gè)參數(shù)放在系統(tǒng)調(diào)用中 , 應(yīng)注意編譯時(shí)對(duì)特殊意義字符的處理 . 命令的查找是按 PATH環(huán)境變量的定義的 , 命令所生成的后果一般不會(huì)對(duì)父進(jìn)程造成影響 . ? 命令執(zhí)行期間 , SIGCHLD信號(hào)被阻塞 , SIGINT和 SIGQUIT信號(hào)被忽略 ? 返回值 :當(dāng)參數(shù)為空指針時(shí) , 只有當(dāng)命令解釋器有效時(shí)返回值為非零 .若參數(shù)不為空指針 , 返回值為該命令的返回狀態(tài)(同 waitpid())的返回值 . 命令無效或語法錯(cuò)誤則返回非零值 ,所執(zhí)行的命令被終止 . 其他情況則返回 1. 注: system接口的本質(zhì)是 fork+exec, 但其執(zhí)行的開銷更大 include int system(const char *string)。我們稱這些函數(shù)為終止處理程序( exit handler),并用 atexit函數(shù)來登記這些函數(shù)。 ? e x i t以登記這些函數(shù)的相反順序調(diào)用它們(類似于壓棧和彈棧方式)。 ? 終止處理程序這一機(jī)制由 ANSI C最新引進(jìn)。 ? 根據(jù) ANSI C和 , exit首先調(diào)用各終止處理程序,然后按需多次調(diào)用 fclose,關(guān)閉所有打開流。 返回:若成功則為 0,若出錯(cuò)則為非 0 atexit示例 $ a . o u t main is done first exit handler first exit handler second exit handler exit和 _exit 兩者的作用都是用來終止當(dāng)前進(jìn)程。 ? 和 exit比較一下, exit()函數(shù)定義在 ,而_exit()定義在 ,其功能差別主要體現(xiàn)在兩點(diǎn): 1) exit按后進(jìn)先出的順序依次調(diào)用 atexit()登記的函數(shù)并執(zhí)行 2) 檢查文件的打開情況,把文件緩沖區(qū)中的內(nèi)容寫回文件 exit和 _exit在 Linux函數(shù)庫中的原型是: include void exit(int status)。 為何? —— exit對(duì)程序的影響 在 Linux的標(biāo)準(zhǔn)函數(shù)庫中,有一套稱作 “ 高級(jí) I/O”的函數(shù): printf()、 fopen()、 fread()、 fwrite()…,它們也被稱作 “ 緩沖 I/O( buffered I/O) ” ,其特征是對(duì)應(yīng)每一個(gè)打開的文件,在內(nèi)存中都有一片緩沖區(qū),每次讀文件時(shí),會(huì)多讀出若干條記錄,這樣下次讀文件時(shí)就可以直接從內(nèi)存的緩沖區(qū)中讀取,每次寫文件的時(shí)候,也僅僅是寫入內(nèi)存中的緩沖區(qū),等滿足了一定的條件(達(dá)到一定數(shù)量,或遇到特定字符,如換行符\n和文件結(jié)束符 EOF),再將緩沖區(qū)中的內(nèi)容一次性寫入文件,這樣就大大增加了文件讀寫的速度,但也為我們編程帶來了一點(diǎn)點(diǎn)麻煩。 實(shí)例: 第一個(gè)輸出: output begin conte
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1