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

正文內(nèi)容

第四章linux進(jìn)程控制-資料下載頁(yè)

2024-09-28 12:36本頁(yè)面

【導(dǎo)讀】集合上的運(yùn)行過(guò)程。行過(guò)程中的不同狀態(tài)的理解。在UNIX中,每個(gè)進(jìn)程在創(chuàng)建時(shí)都會(huì)被分配一個(gè)數(shù)據(jù)。結(jié)構(gòu),稱為進(jìn)程控制塊。一個(gè)或多個(gè)進(jìn)程可以合起來(lái)構(gòu)成一個(gè)進(jìn)程組。程序的標(biāo)識(shí)是程序名或文件名;進(jìn)程的標(biāo)識(shí)就是進(jìn)程號(hào),進(jìn)程號(hào)建立了進(jìn)程和用戶之間的聯(lián)。所有者的,而Linux對(duì)系統(tǒng)資源是進(jìn)行保護(hù)的,調(diào)用成功則對(duì)子進(jìn)程返回0,對(duì)父進(jìn)程返回子進(jìn)程號(hào),進(jìn)程空間及其內(nèi)容。實(shí)際UID,GID和有效UID,GID,附加GID. 預(yù)定值,如優(yōu)先級(jí)和任何其他的進(jìn)程預(yù)定參數(shù),根據(jù)種類不同。子進(jìn)程繼承父進(jìn)程的文件描述符或流時(shí),具有自己。子進(jìn)程的信號(hào)處理函數(shù)指針組置為空.fork的實(shí)現(xiàn)并不做一個(gè)父進(jìn)程數(shù)據(jù)段和堆的。它們的存取許可權(quán)改變?yōu)橹蛔x。第二個(gè)區(qū)別與參數(shù)表的傳遞有關(guān)。字母l表示該函數(shù)取一個(gè)參。捕俘的信號(hào)在新進(jìn)程中被恢復(fù)為缺省設(shè)置,其它的則保持不變.在exec前后實(shí)際用戶ID和實(shí)際組ID保持不變,而有效ID是否改變則取決

  

【正文】 struct sigaction *act,struct sigaction *oldact))。 Sigaction參數(shù) struct sigaction { void (*sa_handler)(int)。 void (*sa_sigaction)(int, siginfo_t *, void *)。 sigset_t sa_mask。 int sa_flags。 void (*sa_restorer)(void)。 } Sigaction結(jié)構(gòu)中的 sa_handler和 sa_sigaction是一個(gè)聯(lián)合結(jié) ?_sa_handler指定與信號(hào) signum相關(guān)聯(lián)的函數(shù),即用戶指定的信號(hào)處理函數(shù),除了可以是用戶自定義的處理函數(shù)外,還可以為 SIG_DFL(采用缺省的處理方式 ),也可以為 SIG_IGN(忽略信號(hào))。 ?sa_mask指定在信號(hào)處理程序執(zhí)行過(guò)程中,哪些信號(hào)應(yīng)當(dāng)被阻塞。缺省情況下當(dāng)前信號(hào)本身被阻塞,以防止信號(hào)的嵌套發(fā)送,除非指定SA_NODEFER或者 SA_NOMASK標(biāo)志位。 ?注意: sa_mask指定的信號(hào)阻塞的條件是,在由 sigaction()安裝信號(hào)的處理函數(shù)執(zhí)行過(guò)程中由 sa_mask指定的信號(hào)才被阻塞。 Sigaction參數(shù) sa_flags中包含了許多標(biāo)志位,它指定了修改信號(hào)處理進(jìn)程行為的一組標(biāo)志。這些標(biāo)志可以以位或形式存在。標(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)語(yǔ)義兼容的行為,使得某些系統(tǒng)調(diào)用通過(guò)信號(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ù)中。因此,聯(lián)合中分量應(yīng)該指定為 sigaction結(jié)構(gòu)中的 sa_sigaction指定處理函數(shù),而不應(yīng)該為 sa_handler指定信號(hào)處理函數(shù),否則,設(shè)置該標(biāo)志變得毫無(wú)意義。即使為sa_sigaction指定了信號(hào)處理函數(shù),如果不設(shè)置 SA_SIGINFO,信號(hào)處理函數(shù)同樣不能得到信號(hào)傳遞過(guò)來(lái)的數(shù)據(jù),在信號(hào)處理函數(shù)中對(duì)這些信息的訪問(wèn)都將導(dǎo)致段錯(cuò)誤( Segmentation fault) Sigaction 由 _sa_handler指定的處理函數(shù)只有一個(gè)參數(shù),即信號(hào)值,所以信號(hào)不能傳遞除信號(hào)值之外的任何信息;由 _sa_sigaction是指定的信號(hào)處理函數(shù)帶有三個(gè)參數(shù),是為實(shí)時(shí)信號(hào)而設(shè)的(當(dāng)然同樣支持非實(shí)時(shí)信號(hào)),它指定一個(gè) 3參數(shù)信號(hào)處理函數(shù)。第一個(gè)參數(shù)為信號(hào)值,第三個(gè)參數(shù)沒(méi)有使用( posix沒(méi)有規(guī)范使用該參數(shù)的標(biāo)準(zhǔn)),第二個(gè)參數(shù)是指向 siginfo_t結(jié)構(gòu)的指針,結(jié)構(gòu)中包含信號(hào)攜帶的數(shù)據(jù)值,結(jié)構(gòu)如下: siginfo_t { int si_signo。 /* 信號(hào)值 , 對(duì)所有信號(hào)有意義 */ int si_errno。 /* errno值 , 對(duì)所有信號(hào)有意義 */ int si_code。 /* 信號(hào)產(chǎn)生的原因 , 對(duì)所有信號(hào)有意義 */ pid_t si_pid。 /* 發(fā)送信號(hào)的進(jìn)程 ID */ uid_t si_uid。 /* 發(fā)送信號(hào)進(jìn)程的真實(shí)用戶 ID */ int si_status。 /* 退出狀態(tài) , 對(duì) SIGCHLD有意義 */ clock_t si_utime。 /* 用戶消耗的時(shí)間 , 對(duì) SIGCHLD有意義 */ clock_t si_stime。 /* 內(nèi)核消耗的時(shí)間 , 對(duì) SIGCHLD有意義 */ sigval_t si_value。 /* 信號(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。 /* 觸發(fā) fault內(nèi)存地址 , 對(duì) SIGILL,SIGFPE,SIGSEGV,SIGBUS信號(hào)有意義 */ int si_band。 /* 對(duì) SIGPOLL信號(hào)有意義 */ int si_fd。 /* 對(duì) SIGPOLL信號(hào)有意義 */ } Sigaction 前面在討論系統(tǒng)調(diào)用 sigqueue發(fā)送信號(hào)時(shí), sigqueue的第三個(gè)參數(shù)就是 sigval聯(lián)合數(shù)據(jù)結(jié)構(gòu),當(dāng)調(diào)用 sigqueue時(shí),該數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)就將拷貝到信號(hào)處理函數(shù)的第二個(gè)參數(shù)中。這樣,在發(fā)送信號(hào)同時(shí),就可以讓信號(hào)傳遞一些附加信息。信號(hào)可以傳遞信息對(duì)程序開(kāi)發(fā)是非常有意義的。 信號(hào)參數(shù)的傳遞過(guò)程可圖示如下: 信號(hào)集及信號(hào)集操作函數(shù) 信號(hào)集被定義為一種數(shù)據(jù)類型 typedef struct { unsigned long int __val[_SIGSET_NWORDS]。 } __sigset_t。 define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) 信號(hào)集用來(lái)描述信號(hào)的集合 , linux所支持的所有信號(hào)可以全部或部分的出現(xiàn)在信號(hào)集中 , 主要與信號(hào)阻塞相關(guān)函數(shù)配合使用 。 下面是為信號(hào)集操作定義的相關(guān)函數(shù): 信號(hào)集及信號(hào)集操作函數(shù) include int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signum) int sigdelset(sigset_t *set, int signum); int sigismember(const sigset_t *set, int signum); sigemptyset(sigset_t *set):初始化由 set指定的信號(hào)集,信號(hào)集里面的所有信號(hào)被清空; sigfillset(sigset_t *set):調(diào)用該函數(shù)后, set指向的信號(hào)集中將包含 linux支持的 64種信號(hào); sigaddset(sigset_t *set, int signum):在 set指向的信號(hào)集中加入 signum信號(hào); sigdelset(sigset_t *set, int signum):在 set指向的信號(hào)集中刪除 signum信號(hào); sigismember(const sigset_t *set, int signum):判定信號(hào) signum是否在 set指向的信號(hào)集中。 信號(hào)阻塞和 信號(hào)未決 每個(gè)進(jìn)程都有一個(gè)用來(lái)描述哪些信號(hào)遞送到進(jìn)程時(shí)將被阻塞的信號(hào)集,該信號(hào)集中的所有信號(hào)在遞送到進(jìn)程后都將被阻塞。 ?sigpending(sigset_t *set))獲得當(dāng)前已遞送到進(jìn)程,卻被阻塞的所有信號(hào),在 set指向的信號(hào)集中返回結(jié)果。 ?sigsuspend(const sigset_t *mask))用于在接收到某個(gè)信號(hào)之前 , 臨時(shí)用 mask替換進(jìn)程的信號(hào)掩碼 , 并暫停進(jìn)程執(zhí)行,直到收到信號(hào)為止。 sigsuspend 返回后將恢復(fù)調(diào)用之前的信號(hào)掩碼。信號(hào)處理函數(shù)完成后,進(jìn)程將繼續(xù)執(zhí)行。該系統(tǒng)調(diào)用始終返回 1,并將 errno設(shè)置為 EINTR。 include int sigpending(sigset_t *set))。 int sigsuspend(const sigset_t *mask)); int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)); 信號(hào)阻塞和 信號(hào)未決 ?sigprocmask()的功能為根據(jù)參數(shù) how來(lái)實(shí)現(xiàn)對(duì)信號(hào)集的操作。若 oldset是非空指針,進(jìn)程的當(dāng)前信號(hào)屏蔽字通過(guò) oldset返回。當(dāng) set是一個(gè)非空指針,操作主要有三種: include int sigpending(sigset_t *set))。 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)集的并集 。 Set包含了我們希望阻塞的附加信號(hào) SIG_UNBLOCK 該進(jìn)程新的信號(hào)屏蔽字是其當(dāng)前信號(hào)屏蔽字和 set所指向信號(hào)集的 交集 。 Set包含了我們希望解除阻塞的信號(hào) 。 SIG_SETMASK 更新進(jìn)程阻塞信號(hào)集為 set指向的信號(hào)集 Sigsuspend示例 上例中 , 如果在解除對(duì) SIGINT的阻塞和 pause之間發(fā)生了 SIGINT信號(hào) , 則此信號(hào)被丟失 。 這是早期的不可靠信號(hào)機(jī)制的另一個(gè)問(wèn)題 。 為了糾正此問(wèn)題,需要在一個(gè)原子操作中實(shí)現(xiàn)恢復(fù)信號(hào)屏蔽字,然后使進(jìn)程睡眠,這種功能是由 sigsuspend函數(shù)所提供的,上例中把后一個(gè) sigprocmask設(shè)置為 sigsuspend()即可。 我們可以通過(guò)更改進(jìn)程的信號(hào)屏蔽字以阻塞或解除阻塞所選擇的信號(hào)。使用這種技術(shù)可以保護(hù)不希望由信號(hào)中斷的臨界代碼。 信號(hào)生命周期(一) 對(duì)于一個(gè)完整的信號(hào)生命周期 (從信號(hào)發(fā)送到相應(yīng)的處理函數(shù)執(zhí)行完畢 )來(lái)說(shuō),可以分為三個(gè)重要的階段,這三個(gè)階段由四個(gè)重要事件來(lái)刻畫:信號(hào)誕生;信號(hào)在進(jìn)程中注冊(cè)完畢;信號(hào)在進(jìn)程中的注銷完畢;信號(hào)處理函數(shù)執(zhí)行完畢。相鄰兩個(gè)事件的時(shí)間間隔構(gòu)成信號(hào)生命周期的一個(gè)階段。 1. 信號(hào) “ 誕生 ” 。信號(hào)的誕生指的是觸發(fā)信號(hào)的事件發(fā)生(如檢測(cè)到硬件異常、定時(shí)器超時(shí)以及調(diào)用信號(hào)發(fā)送函數(shù) kill()或 sigqueue()等)。 2. 信號(hào)在目標(biāo)進(jìn)程中 注冊(cè) ;進(jìn)程的 task_struct結(jié)構(gòu)中有關(guān)于本進(jìn)程中未決信號(hào)的數(shù)據(jù)成員: struct sigpending pending: struct sigpending{ struct sigqueue *head, *tail。 sigset_t signal。 }。 信號(hào)生命周期(二) 第三個(gè)成員是進(jìn)程中所有未決信號(hào)集 , 第一 、 第二個(gè)成員分別指向一個(gè) sigqueue類型的結(jié)構(gòu)鏈 ( 稱之為 未決信號(hào)信息鏈) 的首尾 , 信息鏈中的每個(gè) sigqueue結(jié)構(gòu)刻畫一個(gè)特定信號(hào)所攜帶的信息 , 并指向下一個(gè) sigqueue結(jié)構(gòu) : struct sigqueue{ struct sigqueue *next。 siginfo_t info。 } 信號(hào)在進(jìn)程中注冊(cè)指的就是信號(hào)值加入到進(jìn)程的未決信號(hào)集中( sigpending結(jié)構(gòu)的第二個(gè)成員 sigset_t signal),并且信號(hào)所攜帶的信息被保留到未決信號(hào)信息鏈的某個(gè) sigqueue結(jié)構(gòu)中。只要信號(hào)在進(jìn)程的未決信號(hào)集中,表明進(jìn)程已經(jīng)知道這些信號(hào)的存在,但還沒(méi)來(lái)得及處理,或者該信號(hào)被進(jìn)程阻塞。 信號(hào)生命周期(三) 注 : ?當(dāng)一個(gè)實(shí)時(shí)信號(hào)發(fā)送給一個(gè)進(jìn)程時(shí) , 不管該信號(hào)是否已經(jīng)在進(jìn)程中注冊(cè) , 都會(huì)被再注冊(cè)一次 , 因此 , 信號(hào)不會(huì)丟失 , 因此 , 實(shí)時(shí)信號(hào)又叫做 “ 可靠信號(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)來(lái)登記該信號(hào)信息 , 并把該結(jié)構(gòu)添加在未決信號(hào)鏈尾 , 即所有誕生的實(shí)時(shí)信號(hào)都會(huì)在目標(biāo)進(jìn)程中注冊(cè) ) ; ?當(dāng)一個(gè)非實(shí)時(shí)信號(hào)發(fā)送給一個(gè)進(jìn)程時(shí) , 如果該信號(hào)已經(jīng)在進(jìn)程中注冊(cè) , 則該信號(hào)將被丟棄 , 造成信號(hào)丟失 。 這意味著同一個(gè)非實(shí)時(shí)信號(hào)在進(jìn)程的未決信號(hào)信息鏈中 , 至多占有一個(gè)sigqueue結(jié)構(gòu) ( 一個(gè)非實(shí)時(shí)信號(hào)誕生后 , ( 1) 、 如果發(fā)現(xiàn)相同的信號(hào)已經(jīng)在目標(biāo)結(jié)構(gòu)中注冊(cè) , 則不再注冊(cè) , 對(duì)于進(jìn)程來(lái)說(shuō) , 相當(dāng)于不知道本次信號(hào)發(fā)生 , 信號(hào)丟失; ( 2) 、 如果進(jìn)程的未決信號(hào)中沒(méi)有相同信號(hào) , 則在進(jìn)程中注冊(cè)自己 ) 信號(hào)生命周期(四) 3. 信號(hào)在進(jìn)程中的注銷 。在目標(biāo)進(jìn)程執(zhí)行過(guò)程中,會(huì)檢測(cè)是否有信號(hào)等待處理。如果存在未決信號(hào)等待處理且該信號(hào)沒(méi)有被進(jìn)程阻塞,則在運(yùn)行相應(yīng)的信號(hào)處理函數(shù)前,進(jìn)程會(huì)把信號(hào)在未決信號(hào)鏈中占有的結(jié)構(gòu)卸掉。是否將信號(hào)從進(jìn)程未決信號(hào)集中刪除對(duì)于實(shí)時(shí)與非實(shí)時(shí)信號(hào)是不同的。對(duì)于非實(shí)時(shí)
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1