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

正文內(nèi)容

第四章linux進(jìn)程控制-文庫吧在線文庫

2024-11-11 12:36上一頁面

下一頁面
  

【正文】 為終止處理程序( exit handler),并用 atexit函數(shù)來登記這些函數(shù)。 返回:若成功則為 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(0)。 這些信息都被存儲(chǔ)在僵尸進(jìn)程中,試想如果沒有僵尸進(jìn)程,進(jìn)程一退出,所有與之相關(guān)的信息都立刻歸于無形,而此時(shí)程序員或系統(tǒng)管理員需要用到,就沒有辦法了 問題:由于系統(tǒng)中的主存空間一定,如果系統(tǒng)中僵尸進(jìn)程一直駐留的的話,那么,系統(tǒng)資源將很快耗盡(特別是早期計(jì)算機(jī)系統(tǒng)中內(nèi)存都很小)! UNIX系統(tǒng)中怎樣解決此問題? /* */ include sys/ include main(){ pid_t pid。 ?參數(shù) status用來保存被收集進(jìn)程退出時(shí)的一些狀態(tài),它是一個(gè)指向 int類型的指針。請注意,如果進(jìn)程不是正常退出的,也就是說, WIFEXITED返回 0,這個(gè)值就毫無意義。 ? WUNTRACED:指示子進(jìn)程被跟蹤停止時(shí)也返回,用于實(shí)現(xiàn)調(diào)試控制。 int setgid(gid_t gid) 。在 e x e c按文件用戶 I D設(shè)置了有效用戶 I D后,即進(jìn)行這種復(fù)制,并將此副本保存起來。 ?存在一種情況:如果一個(gè)用戶有多個(gè)登錄名,這些登錄名又對(duì)應(yīng)著同一個(gè)用戶 ID,那么又將如何呢 ?(一個(gè)人在口令文件中可以有多個(gè)登錄項(xiàng),它們的用戶 ID相同,但登錄 shell則不同。典型的會(huì)計(jì)記錄是 3 2字節(jié)長的二進(jìn)制數(shù)據(jù),包括命令名、所使用的 C P U時(shí)間總量、用戶 I D和組 I D、起動(dòng)時(shí)間等。雖然 e x e c并不創(chuàng)建一個(gè)新的記帳記錄,但相應(yīng)記錄中的命令名改變了, A F O R K標(biāo)志則被清除。 /* user time of children */ clock_t tms_cstime。 本章的最后,我們還介紹了 LINUX下的幾個(gè)輔助系統(tǒng)調(diào)用。這就是 “ 不可靠信號(hào) ” 的來源。 第二個(gè)信號(hào)會(huì)造成執(zhí)行默認(rèn)動(dòng)作 , 而對(duì)中斷信號(hào)則是終止該進(jìn)程 。 POSIX對(duì)可靠信號(hào)機(jī)制做了標(biāo)準(zhǔn)化。 ?對(duì)于目前 linux的兩個(gè)信號(hào)安裝函數(shù) :signal()及 sigaction()來說,它們都不能把 SIGRTMIN以前的信號(hào)變成可靠信號(hào)(都不支持排隊(duì),仍有可能丟失,仍然是不可靠信號(hào)),而且對(duì)SIGRTMIN以后的信號(hào)都支持排隊(duì)。 進(jìn)程對(duì)信號(hào)的響應(yīng) 進(jìn)程可以通過三種方式來響應(yīng)一個(gè)信號(hào): 1) 忽略信號(hào) (SIG_DFL),即對(duì)信號(hào)不做任何處理,其中,有兩個(gè)信號(hào)不能忽略: SIGKILL及 SIGSTOP; 2) 捕捉信號(hào) (CATCH)。 ?SIGINT:當(dāng)用戶按中斷鍵(一般采用 DELETE或 CtrlC)時(shí),終端驅(qū)動(dòng)程序產(chǎn)生此信號(hào)并送至前臺(tái)進(jìn)程組中的每一個(gè)進(jìn)程。若由 s e t i t i m e r ( 2 )函數(shù)設(shè)置的間隔時(shí)間已經(jīng)過時(shí),那么也產(chǎn)生此信號(hào) ?SIGTERM:終端信號(hào), 是由 kill(1)命令 發(fā)送的系統(tǒng)默認(rèn)終止信號(hào) ?SIGSTKFLT:棧故障相關(guān)信號(hào) ?SIGCHLD:在一個(gè)進(jìn)程終止或停止 時(shí), SIGCHLD信號(hào)被送給其父進(jìn)程。與上面所述的 SIGTTIN信號(hào)不同,一個(gè)進(jìn)程可以選擇為允許后臺(tái)進(jìn)程寫控制終端。在網(wǎng)絡(luò)連接上,接到非規(guī)定波特率的 數(shù)據(jù)時(shí),此信號(hào)可選擇地產(chǎn)生 ?SIGXCPU:如果進(jìn)程超過了其軟 C P U時(shí)間限制,則產(chǎn)生此信號(hào)。它主要用于具有不間斷電源 (UPS)的系統(tǒng)上,如果電源失效,則 UPS起作用,而且通常軟件會(huì)接到通知。 Shutdown Cancelled 由于目前已能獲得低價(jià)格的 U P S系統(tǒng),它用 RS 232串行連接能夠很容易地將蓄電池電壓過低的條件通知系統(tǒng),于是這種信號(hào)也就更加重要了。 /*用于傳送一批數(shù)據(jù):數(shù)組或結(jié)構(gòu)或其它 */ }sigval_t。 ?如果參數(shù) seconds為零, 將清除鬧鐘時(shí)間,即 進(jìn)程內(nèi)將不再包含任何鬧鐘時(shí)間。 struct timeval { long tv_sec。 abort 向進(jìn)程發(fā)送 SIGABORT信號(hào),默認(rèn)情況下進(jìn)程會(huì)異常退出,當(dāng)然可定義自己的信號(hào)處理函數(shù)。它只有兩個(gè)參數(shù),不支持信號(hào)傳遞信息,主要是用于前 32種非實(shí)時(shí)信號(hào)的安裝; ?sigaction()是較新的函數(shù),有三個(gè)參數(shù),支持信號(hào)傳遞信息,主要用來與 sigqueue() 系統(tǒng)調(diào)用配合使用,當(dāng)然,sigaction()同樣支持非實(shí)時(shí)信號(hào)的安裝。 ?第一個(gè)參數(shù)為信號(hào)的值,可以為除 SIGKILL及 SIGSTOP外的任何一個(gè)特定有效的信號(hào)。 int sa_flags。標(biāo)志包括: SA_NOCLDSTOP:若信號(hào)為 SIGCHLD時(shí),當(dāng)子進(jìn)程停止時(shí),不接收通知(即子進(jìn)程接收下列之一信號(hào)時(shí): SIGSTOP, SIGTSTP, SIGTTIN 或 SIGTTOU) SA_ONESHOT or SA_RESETHAND:一旦信號(hào)處理程序被調(diào)用,恢復(fù)信號(hào)處理為缺省狀態(tài) SA_ONSTACK:在一個(gè)可替換的信號(hào)棧上( sigaltstack(2)提供)調(diào)用信號(hào)處理函數(shù),若可替換的信號(hào)棧不可用,使用缺省棧 SA_RESTART:提供與 BSD信號(hào)語義兼容的行為,使得某些系統(tǒng)調(diào)用通過信號(hào)可以重新執(zhí)行 (restartable) SA_NOMASK or SA_NODEFER:不阻止 (屏蔽 )信號(hào)處理程序中收到的信號(hào) SA_SIGINFO:這是一個(gè)比較重要的標(biāo)志位,當(dāng)設(shè)定了該標(biāo)志位時(shí),表示信號(hào)附帶的參數(shù)可以被傳遞到信號(hào)處理函數(shù)中。 /* 發(fā)送信號(hào)進(jìn)程的真實(shí)用戶 ID */ int si_status。這樣,在發(fā)送信號(hào)同時(shí),就可以讓信號(hào)傳遞一些附加信息。 ?sigsuspend(const sigset_t *mask))用于在接收到某個(gè)信號(hào)之前 , 臨時(shí)用 mask替換進(jìn)程的信號(hào)掩碼 , 并暫停進(jìn)程執(zhí)行,直到收到信號(hào)為止。 int sigsuspend(const sigset_t *mask)); int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)); 參數(shù) how 進(jìn)程當(dāng)前信號(hào)集 set SIG_BLOCK 在進(jìn)程當(dāng)前阻塞信號(hào)集中添加 set指向信號(hào)集中的信號(hào),即 該進(jìn)程新的信號(hào)屏蔽字是其當(dāng)前信號(hào)屏蔽字和 set指向信號(hào)集的并集 。 信號(hào)生命周期(一) 對(duì)于一個(gè)完整的信號(hào)生命周期 (從信號(hào)發(fā)送到相應(yīng)的處理函數(shù)執(zhí)行完畢 )來說,可以分為三個(gè)重要的階段,這三個(gè)階段由四個(gè)重要事件來刻畫:信號(hào)誕生;信號(hào)在進(jìn)程中注冊完畢;信號(hào)在進(jìn)程中的注銷完畢;信號(hào)處理函數(shù)執(zhí)行完畢。 siginfo_t info。是否將信號(hào)從進(jìn)程未決信號(hào)集中刪除對(duì)于實(shí)時(shí)與非實(shí)時(shí)信號(hào)是不同的。 這意味著同一個(gè)實(shí)時(shí)信號(hào)可以在同一個(gè)進(jìn)程的未決信號(hào)信息鏈中占有多個(gè) sigqueue結(jié)構(gòu) ( 進(jìn)程每收到一個(gè)實(shí)時(shí)信號(hào) , 都會(huì)為它分配一個(gè)結(jié)構(gòu)來登記該信號(hào)信息 , 并把該結(jié)構(gòu)添加在未決信號(hào)鏈尾 , 即所有誕生的實(shí)時(shí)信號(hào)都會(huì)在目標(biāo)進(jìn)程中注冊 ) ; ?當(dāng)一個(gè)非實(shí)時(shí)信號(hào)發(fā)送給一個(gè)進(jìn)程時(shí) , 如果該信號(hào)已經(jīng)在進(jìn)程中注冊 , 則該信號(hào)將被丟棄 , 造成信號(hào)丟失 。 2. 信號(hào)在目標(biāo)進(jìn)程中 注冊 ;進(jìn)程的 task_struct結(jié)構(gòu)中有關(guān)于本進(jìn)程中未決信號(hào)的數(shù)據(jù)成員: struct sigpending pending: struct sigpending{ struct sigqueue *head, *tail。 這是早期的不可靠信號(hào)機(jī)制的另一個(gè)問題 。 include int sigpending(sigset_t *set))。 define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) 信號(hào)集用來描述信號(hào)的集合 , linux所支持的所有信號(hào)可以全部或部分的出現(xiàn)在信號(hào)集中 , 主要與信號(hào)阻塞相關(guān)函數(shù)配合使用 。 /* 信號(hào)值 , 對(duì)所有實(shí)時(shí)有意義 , 是一個(gè)聯(lián)合數(shù)據(jù)結(jié)構(gòu) , 可以為一個(gè)整數(shù) ( 由 si_int標(biāo)示 , 也可以為一個(gè)指針 , 由 si_ptr標(biāo)示 ) */ void * si_addr。 /* 信號(hào)值 , 對(duì)所有信號(hào)有意義 */ int si_errno。缺省情況下當(dāng)前信號(hào)本身被阻塞,以防止信號(hào)的嵌套發(fā)送,除非指定SA_NODEFER或者 SA_NOMASK標(biāo)志位。 include int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact))。 ?如果 signal()調(diào)用成功,返回最后一次為安裝信號(hào) signum而調(diào)用 signal()時(shí)的 handler值;失敗則返回 SIG_ERR。 信號(hào)的安裝(設(shè)置信號(hào)關(guān)聯(lián)動(dòng)作) ?如果進(jìn)程要處理某一信號(hào),那么就要在進(jìn)程中安裝該信號(hào)。 定時(shí)器中值從 it_value減至 0時(shí) ,產(chǎn)生一信號(hào) , 并把 it_value值復(fù)位至 it_interval, 對(duì)于設(shè)置為 0的定時(shí)器則停止計(jì)時(shí) ( it_value為 0或定時(shí)器時(shí)間已經(jīng)到達(dá)并且 it_interval為 0) 。 include sys/ int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue))。由于 sigqueue系統(tǒng)調(diào)用支持發(fā)送帶參數(shù)信號(hào),所以比 kill()系統(tǒng)調(diào)用的功能要靈活和強(qiáng)大得多。 raise()等價(jià)于 kill(getpid(), sig) include int raise(int signo) sigqueue sigqueue()是比較新的發(fā)送信號(hào)系統(tǒng)調(diào)用,主要是針對(duì)實(shí)時(shí)信號(hào)提出的(當(dāng)然也支持前 32種),支持信號(hào)帶有參數(shù),與函數(shù) sigaction()配合使用。在大多數(shù)系統(tǒng)中使接到蓄電池電壓過低的進(jìn)程將信號(hào) SIGPWR發(fā)送給init進(jìn)程,然后由 init處理停機(jī)操作。 ?SIGWINCH:如果一個(gè)進(jìn)程用 ioctl的設(shè)置 窗口 大 小命令更改了窗口大小,則內(nèi)核將 SIGWINCH信號(hào)送至前臺(tái)進(jìn)程組。因此,終端驅(qū)動(dòng)程序?qū)a(chǎn)生交互停止信號(hào)和字符稱之為掛起字符而非停止字符。 ?SIGCONT:跟蹤調(diào)試時(shí)的繼續(xù)信號(hào) ?SIGSTOP: 是一個(gè)作業(yè)控制信號(hào),它停止一個(gè)進(jìn)程, SIGSTOP不能被捕捉或忽略 ? SIGTSTP:交互停止信號(hào),當(dāng)用戶在終端上按掛起鍵(一般采用 CtrlZ)時(shí),終端驅(qū)動(dòng)程序產(chǎn)生此信號(hào)。進(jìn)程異常終止 ?SIGIOT: IOT自陷,指示一個(gè)實(shí)現(xiàn)定義的硬件故障 ?SIGBUS:總線錯(cuò),指示一個(gè)實(shí)現(xiàn)定義的硬件故障 ?SIGFPE:浮點(diǎn)相關(guān)異常 ?SIGKILL:這是兩個(gè)不能被捕捉或忽略信號(hào)中的一個(gè)。 關(guān)于上表的說明 在系統(tǒng)默認(rèn)動(dòng)作列 , “ 終止 w / c o r e”表示在進(jìn)程當(dāng)前工作目錄的產(chǎn)生了 c o r e文件 , 該文件中記錄了該進(jìn)程非正常退出時(shí)的存儲(chǔ)圖像 , 大多數(shù) U N I X調(diào)試程序都使用 c o r e文件以檢查進(jìn)程在終止時(shí)的狀態(tài) 。 ?后 32個(gè)信號(hào) (SIGRTMIN=31, SIGRTMAX=63)表示實(shí)時(shí)信號(hào),等同于前面闡述的可靠信號(hào)。 一點(diǎn)說明 ?可靠信號(hào)是指后來添加的新信號(hào)(信號(hào)值位于 SIGRTMIN及 SIGRTMAX之間);不可靠信號(hào)是信號(hào)值小于SIGRTMIN的信號(hào)。 可靠信號(hào) ?隨著時(shí)間的發(fā)展,實(shí)踐證明了有必要對(duì)信號(hào)的原始機(jī)制加以改進(jìn)和擴(kuò)充。早期 unix下的不可靠信號(hào)主要指的是進(jìn)程可能對(duì)信號(hào)做出錯(cuò)誤的反應(yīng)以及信號(hào)可能丟失。 ?信號(hào)機(jī)制經(jīng)過 POSIX實(shí)時(shí)擴(kuò)展后,功能更加強(qiáng)大,除了基本通知功能外,還可以傳遞附加信息。 小結(jié) 對(duì)在 LINUX環(huán)境中的高級(jí)程序設(shè)計(jì)而言,完整地了解 LINUX的進(jìn)程控制非常重要。 進(jìn)程執(zhí)行時(shí)間 用戶進(jìn)程可以通過調(diào)用 t i m e s函數(shù)獲得它自己及終止子進(jìn)程的時(shí)間值 。為了確定起動(dòng)順序,需要讀全部記帳文件,并按起動(dòng)日歷時(shí)間進(jìn)行排序。 include char *getlogin(void)。來拋棄 root權(quán)限。 2) 僅當(dāng)對(duì)程序文件設(shè)置了設(shè)置 用戶 ID位時(shí), exec函數(shù)才改變有效用戶 ID。 2)若進(jìn)程沒有超級(jí)用戶特權(quán),但 uid等于實(shí)際用戶 ID或保存的設(shè)置 用戶 ID,則 setuid只將有效用戶 ID設(shè)置為 uid。 3. pid=0時(shí),等待同一個(gè)進(jìn)程組中的任何子進(jìn)程,如果子進(jìn)程已經(jīng)加入了別的進(jìn)程組, waitpid不會(huì)對(duì)它做任何理睬。 進(jìn)程回收的兩個(gè)重要提示: ? Shell負(fù)責(zé)回收所有前臺(tái)進(jìn)程 ? Init進(jìn)程負(fù)責(zé)回收所有后臺(tái)進(jìn)程和其它用戶未回收的進(jìn)程 include sy
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1