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

正文內(nèi)容

第四章linux進程控制-文庫吧資料

2024-10-06 12:36本頁面
  

【正文】 進程組進程試圖讀其控制終端時,終端驅(qū)動程序產(chǎn)生此信號。信號捕捉函數(shù)中通常要調(diào)用 wait函數(shù)以取得子進程 ID和其終止狀態(tài)。按系統(tǒng)默認,將忽略此信號。當套接口的一端已經(jīng)終止時,若進程寫該套接口也產(chǎn)生此信號 ?SIGALRM: 用 alarm函數(shù)設置的時間到達時產(chǎn)生此信號。它向系統(tǒng)管理員提供了一種可以殺死任一進程的可靠方法。此信號不僅終止前臺進程組(如 SIGINT所做的那樣),同時產(chǎn)生一個 core文件 ?SIGILL:此信號指示進程已執(zhí)行一條非法硬件指令 ?SIGTRAP:指示一個實現(xiàn)定義的硬件故障,一般用于跟蹤調(diào)試自陷 ?SIGABRT:調(diào)用 abort函數(shù)時產(chǎn)生此信號。當一個進程在運行時失控,特別是它正在屏幕上產(chǎn) 生大量不需要的輸出時,常用此信號終止它。 LINUX信號列表 (按序號排列 ) ?SIGHUP:如果終端界面檢測到一個連接斷開,則將此信號送給與該終端相關(guān)的控制進程(對話期首進程)。 在下列條件下不產(chǎn)生 c o r e文件: ( a )進程是設置 用戶 ID, 而且當前用戶并非程序文件的所有者 ( b )進程是設置 組 ID, 而且當前用戶并非該程序文件的組所有者 ( c )用戶沒有寫當前工作目錄的許可權(quán) ( d )文件太大 。 Linux究竟采用上述三種方式的哪一個來響應信號,取決于傳遞給相應 API函數(shù)的參數(shù)。定義信號處理函數(shù),當信號發(fā)生時,執(zhí)行相應的處理函數(shù); 3) 執(zhí)行缺省操作 (SIG_IGN), Linux對每種信號都規(guī)定了默認操作,詳細情況請參考下表。 ?非實時信號都不支持排隊,都是不可靠信號;實時信號都支持排隊,都是可靠信號。這保證了發(fā)送的多個實時信號都被接收。 ?前 32種信號已經(jīng)有了預定義值,每個信號有了確定的用途及含義,并且每種信號都有各自的缺省動作。 這兩個函數(shù)的最大區(qū)別在于, 經(jīng)過 sigaction安裝的信號都能傳遞信息 給信號處理函數(shù)(對所有信號這一點都成立),而經(jīng)過 signal安裝的信號卻不能向信號處理函數(shù)傳遞信息 ,對于信號發(fā)送函數(shù)來說也是一樣的。同時,由 signal()安裝的實時信號支持排隊,同樣不會丟失。信號的可靠與不可靠只與信號值有關(guān),與信號的發(fā)送及安裝函數(shù)無關(guān)。 Linux在支持新版本的信號安裝函數(shù) sigation()以及信號發(fā)送函數(shù) sigqueue()的同時,仍然支持早期的 signal()信號安裝函數(shù)和 kill()函數(shù)。但是, POSIX只對可靠信號機制應具有的功能以及信號機制的對外接口做了標準化,對信號機制的實現(xiàn)沒有作具體的規(guī)定。 ?信號的發(fā)送和安裝也出現(xiàn)了新版本:信號發(fā)送函數(shù) sigqueue()及信號安裝函數(shù) sigaction()。所以,后來出現(xiàn)的各種 Unix版本分別在這方面進行了研究,力圖實現(xiàn) “ 可靠信號 ” 。因此, Linux下的不可靠信號問題主要指的是信號可能丟失。這種類型的程序段在大多數(shù)情況下會正常工作 , 使得我們認為它們正確 ,而實際上卻并不是如此 。 在此段時間中 , 可能發(fā)生另一次中斷信號 。這種情況主要出現(xiàn)在:當信號處理函數(shù)執(zhí)行過程中到來的所有相同信號,都被合并為一個信號。 ?信號可能丟失。它的主要問題是: ?進程每次處理信號后,就將對信號的響應設置為默認動作。早期Unix系統(tǒng)中的信號機制比較簡單和原始,后來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的信號叫做“ 不可靠信號 ” ,信號值小于 SIGRTMIN(Red hat LINUX中,SIGRTMIN=32, SIGRTMAX=63)的信號都是不可靠信號。 信號的來源 信號事件的發(fā)生有兩個來源: ?硬件來源 ?硬件中斷觸發(fā),如鍵盤 ?其它硬件故障,如 IO BUS error ?硬件觸發(fā)的程序異常 ?軟件來源 ?程序或命令控制的信號,如: kill, raise等 ?系統(tǒng)鬧鐘 ?程序調(diào)試 ?程序異常,如:段違例、非法運算等操作 ?… 信號的種類 可以從兩個不同的分類角度對信號進行分類: 1) 可靠性方面:可靠信號與不可靠信號; 2) 與時間的關(guān)系上:實時信號與非實時信號。 ?信號是進程間通信機制中唯一的異步通信機制,可以看作是異步通知,通知接收信號的進程有哪些事情發(fā)生了。 第六章 LINUX下的信號 信號的本質(zhì) ?信號是在軟件層次上是對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。 對各種不同的用戶 I D和組 I D (實際,有效和保存的 )的理解和編寫安全的設置 用戶 I D程序是至關(guān)重要的。 其中必須熟練掌握的只有幾個 —— fork、 exec族、 _exit、wait和 waitpid。 include sys/ clock_t times(struct tms *buf)。 /* system time of children*/ }。 /* system time */ clock_t tms_cutime。 此函數(shù)填寫由 buf指向的 tms結(jié)構(gòu),該結(jié)構(gòu)定義如下: struct tms { clock_t tms_utime。 include int acct(const char *filename)。這意味著,如果一個進程順序執(zhí)行了三個程序 (A exec B,B exec C,最后 C exit),但只寫一個會計記錄。在 f o r k之后,內(nèi)核為子進程初始化一個記錄,而不是在一個新程序被執(zhí)行時。這不是一種很完善的方法,因為日歷時間的單位是秒,在一個給定的秒中可能起動了多個進程。這就意味著在記帳文件中記錄的順序?qū)谶M程終止的順序,而不是它們起動的順序。 ?記帳記錄所需的各個數(shù)據(jù)都由內(nèi)核保存在進程表中,并在一個新進程被創(chuàng)建時置初值 (例如 fork之后在子進程中 )。當取了這種選擇項后,每當進程結(jié)束時內(nèi)核就寫一個會計記錄。 進程統(tǒng)計 參數(shù)非空時, acct打開系統(tǒng)記帳并把終止進程的信息追加到該文件中,參數(shù)空時,關(guān)閉系統(tǒng)記帳功能。用戶得到了登錄名,就可用 getpwnam在口令文件中查找相應記錄以確定其登錄 shell等。)系統(tǒng)通常保存用戶的登錄名,用 getlogin函數(shù)可以存取此登錄名。 用戶 ID轉(zhuǎn)換關(guān)系圖 取用戶標識 getlogin Getlogin()返回用戶登陸名 ?一般情況下,我們可以調(diào)用 getpwuid(getuid()),得到用戶名、真實姓名及 HOME目錄等信息。 ?進程 uid和 euid不一致時 Linux系統(tǒng)將不會產(chǎn)生 core dump include sys/ include int setreuid(uid_t ruid, uid_t euid) 。 ?一般在編寫具 setuid root的程序時,為減少此類程序帶來的系統(tǒng)安全風險,在使用完 root權(quán)限后建議馬上執(zhí)行 setuid(getuid())。下表列出了改變這三個用戶 I D的不同方法。 3) 保存的設置 用戶 I D是由 e x e c從有效用戶 I D復制的。如果設置 用戶 ID位沒有設置,則 exec函數(shù)不會改變有效用戶 ID,而將其維持為原先值。因為 login是一個超級用戶進程,當它調(diào)用 setuid時,設置所有三個用戶 ID。 關(guān)于設置用戶和組 ID的注意事項 關(guān)于內(nèi)核所維護的三個用戶 ID,還要注意下列幾點: 1) 只有超級用戶進程可以更改實際用戶 ID。 include sys/ include int setuid(uid_t uid) 。不改變實際用戶 ID和保存的設置 用戶 ID。 關(guān)于更改用戶 ID的 若干規(guī)則(同樣適用于組 ID): 1)若進程具有超級用戶特權(quán),則 setuid函數(shù)可將實際用戶 ID、有效用戶 ID,以及保存的設置 用戶 ID設置為 uid參數(shù)值 。 waitpid的返回值比 wait稍微復雜一些,一共有 3種情況: ? 當正常返回的時候, waitpid返回收集到的子進程的進程 ID; ? 如果設置了選項 WNOHANG,而調(diào)用中 waitpid發(fā)現(xiàn)沒有已退出的子進程可收集,則返回 0; ? 如果調(diào)用中出錯,則返回 1,這時 errno會被設置成相應的值以指示錯誤所在; 當 pid所指示的子進程不存在,或此進程存在,但不是調(diào)用進程的子進程,waitpid就會出錯返回,這時 errno被設置為 ECHILD; include sys/ /* 提供類型 pid_t的定義 */ include sys/ pid_t waitpid(pid_t pid,int *status,int options) 更改用戶和組 ID setuid函數(shù)設置實際用戶 ID和有效用戶 ID??捎糜谠诔绦蛑胁迦霗z測。 4. pid1時,等待一個指定進程組中的任何子進程,這個進程組的 ID等于 pid的絕對值。 2. pid=1時,等待任何一個子進程退出,沒有任何限制,此時 waitpid和 wait的作用一模一樣。 waitpid 從本質(zhì)上講,系統(tǒng)調(diào)用 waitpid和 wait的作用是完全相同的,但 waitpid多出了兩個可由用戶控制的參數(shù) pid和 options,從而為我們編程提供了另一種更靈活的方式。) ? WEXITSTATUS(status) 當 WIFEXITED返回非零值時,我們可以用這個宏來提取子進程的返回值,如果子進程調(diào)用 exit(5)退出,WEXITSTATUS(status)就會返回 5;如果子進程調(diào)用 exit(7),WEXITSTATUS(status)就會返回 7。由于這些信息被存放在一個整數(shù)的不同二進制位中,所以用常規(guī)的方法讀取會非常麻煩,人們就設計了一套專門的宏來完成這項工作,下面介紹其中最常用的兩個: ? WIFEXITED(status) 這個宏用來指出子進程是否為正常退出的,如果是,它會返回一個非零值。這種情況稱為進程之間的同步,更準確地說,這是進程同步的一種特例。但如果對這個子進程是如何死掉的毫不在意,只想把這個僵尸進程消滅掉,我們就可以設定這個參數(shù)為 NULL,如果成功, wait會返回被收集的子進程的進程 ID,如果調(diào)用進程沒有子進程,調(diào)用就會失敗,此時 wait返回 1,同時 errno被置為 ECHILD。[1] 1577 $ ps ax 1177 pts/0 S 0:00 bash 1577 pts/0 S 0:00 ./zombie 1578 pts/0 Z 0:00 [zombie defunct] 1579 pts/0 R 0:00 ps –ax 說明: 進程狀態(tài)一欄中間的 Z狀態(tài)就是僵尸進程的標志,它表示 1578號進程現(xiàn)在就是一個僵尸進程 示例 Wait ?Wait的作用是等待子進程結(jié)束,由 wait自動分析是否當前進程的某個子進程已經(jīng)退出,如果讓它找到了這樣一個已經(jīng)變成僵尸的子進程, wait就會收集這個子進程的信息,并把它徹底回收后返回;如果沒有找到這樣一個子進程, wait就會一直阻塞在這里,直到有一個出現(xiàn)為止。 /* 休眠 60秒,這段時間里,父進程什么也干不了 */ wait(NULL)。 else if(pid==0) /* 如果是子進程 */ exit(0)。 pid=fork()。 —— 示例 ?僵尸進程的由來: LINUX中僵尸進程的概念也是從傳統(tǒng) UNIX上繼承而來 ?僵尸進程的作用 僵尸進程中保存著很多對程序員和系統(tǒng)管理員非常重要的信息,包括: ? 這個進程是怎么死亡的?是正常退出呢,還是出現(xiàn)了錯誤,還是被其它進程強迫退出的? ? 這個進程占用的總系統(tǒng) CPU時間和總用戶 CPU時間分別是多少?發(fā)生頁錯誤的數(shù)目和收到信號的數(shù)目。在 Linux進程的 5種狀態(tài)中,僵尸進程是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態(tài)等信息供其他進程收集,除此之外,僵尸進程不再占有任何進程空間。 exit(0)。 } /* */ include main(){ printf(output begin\n)。 printf(content in buffer)。 如果有一些數(shù)據(jù),我們認為已經(jīng)寫入了文件,實際上因為沒有滿足特定的條件,它們還只是保存在緩沖區(qū)內(nèi),這時我們用 _exit()函數(shù)直接將進程關(guān)閉,緩沖區(qū)中的數(shù)據(jù)就會丟失,反之,如果想保證數(shù)據(jù)的完整性,就一定要使用 exit()函數(shù)。 include void _exit(int status)。無論在程序中的什么位置,只要執(zhí)行到 exit系統(tǒng)調(diào)用,進程就會停止剩下的所有操作,清除包括 PCB在內(nèi)的各種數(shù)據(jù)結(jié)構(gòu),終止本進程的運行。 include int atexit(void (* f u n c) ( v o i d ) ) 。 SVR4和 +BSD都提供這種
點擊復制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1