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

正文內(nèi)容

linux環(huán)境進(jìn)程間通信(全)-資料下載頁(yè)

2025-06-19 14:14本頁(yè)面
  

【正文】 struct timeval { long tv_sec。 /* seconds */ long tv_usec。 /* microseconds */ }。附錄2三參數(shù)信號(hào)處理函數(shù)中第二個(gè)參數(shù)的說(shuō)明性描述: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,對(duì)kill(2),實(shí)時(shí)信號(hào)以及SIGCHLD有意義 */uid_t si_uid。 /* 發(fā)送信號(hào)進(jìn)程的真實(shí)用戶(hù)ID,對(duì)kill(2),實(shí)時(shí)信號(hào)以及SIGCHLD有意義 */int si_status。 /* 退出狀態(tài),對(duì)SIGCHLD有意義*/clock_t si_utime。 /* 用戶(hù)消耗的時(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)有意義 */}實(shí)際上,除了前三個(gè)元素外,其他元素組織在一個(gè)聯(lián)合結(jié)構(gòu)中,在聯(lián)合數(shù)據(jù)結(jié)構(gòu)中,又根據(jù)不同的信號(hào)組織成不同的結(jié)構(gòu)。注釋中提到的對(duì)某種信號(hào)有意義指的是,在該信號(hào)的處理函數(shù)中可以訪(fǎng)問(wèn)這些域來(lái)獲得與信號(hào)相關(guān)的有意義的信息,只不過(guò)特定信號(hào)只對(duì)特定信息感興趣而已。三.Linux環(huán)境進(jìn)程間通信(二):信號(hào)(下)信號(hào)生命周期從信號(hào)發(fā)送到信號(hào)處理函數(shù)的執(zhí)行完畢對(duì)于一個(gè)完整的信號(hào)生命周期(從信號(hào)發(fā)送到相應(yīng)的處理函數(shù)執(zhí)行完畢)來(lái)說(shuō),可以分為三個(gè)重要的階段,這三個(gè)階段由四個(gè)重要事件來(lái)刻畫(huà):信號(hào)誕生;信號(hào)在進(jìn)程中注冊(cè)完畢;信號(hào)在進(jìn)程中的注銷(xiāo)完畢;信號(hào)處理函數(shù)執(zhí)行完畢。相鄰兩個(gè)事件的時(shí)間間隔構(gòu)成信號(hào)生命周期的一個(gè)階段。下面闡述四個(gè)事件的實(shí)際意義: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。}。第三個(gè)成員是進(jìn)程中所有未決信號(hào)集,第一、第二個(gè)成員分別指向一個(gè)sigqueue類(lèi)型的結(jié)構(gòu)鏈(稱(chēng)之為未決信號(hào)信息鏈)的首尾,信息鏈中的每個(gè)sigqueue結(jié)構(gòu)刻畫(huà)一個(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)程阻塞。 注: 當(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)丟失。因此,非實(shí)時(shí)信號(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è)自己)。 3. 信號(hào)在進(jìn)程中的注銷(xiāo)。在目標(biāo)進(jìn)程執(zhí)行過(guò)程中,會(huì)檢測(cè)是否有信號(hào)等待處理(每次從系統(tǒng)空間返回到用戶(hù)空間時(shí)都做這樣的檢查)。如果存在未決信號(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í)信號(hào)來(lái)說(shuō),由于在未決信號(hào)信息鏈中最多只占用一個(gè)sigqueue結(jié)構(gòu),因此該結(jié)構(gòu)被釋放后,應(yīng)該把信號(hào)在進(jìn)程未決信號(hào)集中刪除(信號(hào)注銷(xiāo)完畢);而對(duì)于實(shí)時(shí)信號(hào)來(lái)說(shuō),可能在未決信號(hào)信息鏈中占用多個(gè)sigqueue結(jié)構(gòu),因此應(yīng)該針對(duì)占用sigqueue結(jié)構(gòu)的數(shù)目區(qū)別對(duì)待:如果只占用一個(gè)sigqueue結(jié)構(gòu)(進(jìn)程只收到該信號(hào)一次),則應(yīng)該把信號(hào)在進(jìn)程的未決信號(hào)集中刪除(信號(hào)注銷(xiāo)完畢)。否則,不應(yīng)該在進(jìn)程的未決信號(hào)集中刪除該信號(hào)(信號(hào)注銷(xiāo)完畢)。 進(jìn)程在執(zhí)行信號(hào)相應(yīng)處理函數(shù)之前,首先要把信號(hào)在進(jìn)程中注銷(xiāo)。 4. 信號(hào)生命終止。進(jìn)程注銷(xiāo)信號(hào)后,立即執(zhí)行相應(yīng)的信號(hào)處理函數(shù),執(zhí)行完畢后,信號(hào)的本次發(fā)送對(duì)進(jìn)程的影響徹底結(jié)束。 注: 1)信號(hào)注冊(cè)與否,與發(fā)送信號(hào)的函數(shù)(如kill()或sigqueue()等)以及信號(hào)安裝函數(shù)(signal()及sigaction())無(wú)關(guān),只與信號(hào)值有關(guān)(信號(hào)值小于SIGRTMIN的信號(hào)最多只注冊(cè)一次,信號(hào)值在SIGRTMIN及SIGRTMAX之間的信號(hào),只要被進(jìn)程接收到就被注冊(cè))。 2)在信號(hào)被注銷(xiāo)到相應(yīng)的信號(hào)處理函數(shù)執(zhí)行完畢這段時(shí)間內(nèi),如果進(jìn)程又收到同一信號(hào)多次,則對(duì)實(shí)時(shí)信號(hào)來(lái)說(shuō),每一次都會(huì)在進(jìn)程中注冊(cè);而對(duì)于非實(shí)時(shí)信號(hào)來(lái)說(shuō),無(wú)論收到多少次信號(hào),都會(huì)視為只收到一個(gè)信號(hào),只在進(jìn)程中注冊(cè)一次。 信號(hào)編程注意事項(xiàng) 防止不該丟失的信號(hào)丟失如果對(duì)八中所提到的信號(hào)生命周期理解深刻的話(huà),很容易知道信號(hào)會(huì)不會(huì)丟失,以及在哪里丟失。 程序的可移植性考慮到程序的可移植性,應(yīng)該盡量采用POSIX信號(hào)函數(shù),POSIX信號(hào)函數(shù)主要分為兩類(lèi): o POSIX : Kill()、sigaction()、sigaddset()、sigdelset()、sigemptyset()、sigfillset()、sigismember()、sigpending()、sigprocmask()、sigsuspend()。 o POSIX 。POSIX ,包括以下三個(gè)函數(shù): sigqueue()、sigtimedwait()、sigwaitinfo()。其中,sigqueue主要針對(duì)信號(hào)發(fā)送,而sigtimedwait及sigwaitinfo()主要用于取代sigsuspend()函數(shù),后面有相應(yīng)實(shí)例。 include int sigwaitinfo(sigset_t *set, siginfo_t *info).該函數(shù)與sigsuspend()類(lèi)似,阻塞一個(gè)進(jìn)程直到特定信號(hào)發(fā)生,但信號(hào)到來(lái)時(shí)不執(zhí)行信號(hào)處理函數(shù),而是返回信號(hào)值。因此為了避免執(zhí)行相應(yīng)的信號(hào)處理函數(shù),必須在調(diào)用該函數(shù)前,使進(jìn)程屏蔽掉set指向的信號(hào),因此調(diào)用該函數(shù)的典型代碼是:sigset_t newmask。int rcvd_sig。 siginfo_t info。sigemptyset(amp。newmask)。sigaddset(amp。newmask, SIGRTMIN)。sigprocmask(SIG_BLOCK, amp。newmask, NULL)。rcvd_sig = sigwaitinfo(amp。newmask, amp。info) if (rcvd_sig == 1) { ..}調(diào)用成功返回信號(hào)值,否則返回1。sigtimedwait()功能相似,只不過(guò)增加了一個(gè)進(jìn)程等待的時(shí)間。 程序的穩(wěn)定性為了增強(qiáng)程序的穩(wěn)定性,在信號(hào)處理函數(shù)中應(yīng)使用可重入函數(shù)。 信號(hào)處理程序中應(yīng)當(dāng)使用可再入(可重入)函數(shù)(注:所謂可重入函數(shù)是指一個(gè)可以被多個(gè)任務(wù)調(diào)用的過(guò)程,任務(wù)在調(diào)用時(shí)不必?fù)?dān)心數(shù)據(jù)是否會(huì)出錯(cuò))。因?yàn)檫M(jìn)程在收到信號(hào)后,就將跳轉(zhuǎn)到信號(hào)處理函數(shù)去接著執(zhí)行。如果信號(hào)處理函數(shù)中使用了不可重入函數(shù),那么信號(hào)處理函數(shù)可能會(huì)修改原來(lái)進(jìn)程中不應(yīng)該被修改的數(shù)據(jù),這樣進(jìn)程從信號(hào)處理函數(shù)中返回接著執(zhí)行時(shí),可能會(huì)出現(xiàn)不可預(yù)料的后果。不可再入函數(shù)在信號(hào)處理函數(shù)中被視為不安全函數(shù)。滿(mǎn)足下列條件的函數(shù)多數(shù)是不可再入的:(1)使用靜態(tài)的數(shù)據(jù)結(jié)構(gòu),如getlogin(),gmtime(),getgrgid(),getgrnam(),getpwuid()以及getpwnam()等等;(2)函數(shù)實(shí)現(xiàn)時(shí),調(diào)用了malloc()或者free()函數(shù);(3)實(shí)現(xiàn)時(shí)使用了標(biāo)準(zhǔn)I/O函數(shù)的。The Open Group視下列函數(shù)為可再入的:_exit()、access()、alarm()、cfgetispeed()、cfgetospeed()、cfsetispeed()、cfsetospeed()、chdir()、chmod()、chown()、close()、creat()、dup()、dup2()、execle()、execve()、ftl()、fork()、fpathconf()、fstat()、fsync()、getegid()、 geteuid()、getgid()、getgroups()、getpgrp()、getpid()、getppid()、getuid()、kill()、link()、lseek()、mkdir()、mkfifo()、 open()、pathconf()、pause()、pipe()、raise()、read()、rename()、rmdir()、setgid()、setpgid()、setsid()、setuid()、 sigaction()、sigaddset()、sigdelset()、sigemptyset()、sigfillset()、sigismember()、signal()、sigpending()、sigprocmask()、sigsuspend()、sleep()、stat()、sysconf()、tcdrain()、tcflow()、tcflush()、tcgetattr()、tcgetpgrp()、tcsendbreak()、tcsetattr()、tcsetpgrp()、time()、times()、 umask()、uname()、unlink()、utime()、wait()、waitpid()、write()。 即使信號(hào)處理函數(shù)使用的都是安全函數(shù),同樣要注意進(jìn)入處理函數(shù)時(shí),首先要保存errno的值,結(jié)束時(shí),再恢復(fù)原值。因?yàn)椋盘?hào)處理過(guò)程中,errno值隨時(shí)可能被改變。另外,longjmp()以及siglongjmp()沒(méi)有被列為可再入函數(shù),因?yàn)椴荒鼙WC緊接著兩個(gè)函數(shù)的其它調(diào)用是安全的。深入淺出:信號(hào)應(yīng)用實(shí)例linux下的信號(hào)應(yīng)用并沒(méi)有想象的那么恐怖,程序員所要做的最多只有三件事情:1. 安裝信號(hào)(推薦使用sigaction()); 2. 實(shí)現(xiàn)三參數(shù)信號(hào)處理函數(shù),handler(int signal,struct siginfo *info, void *); 3. 發(fā)送信號(hào),推薦使用sigqueue()。 實(shí)際上,對(duì)有些信號(hào)來(lái)說(shuō),只要安裝信號(hào)就足夠了(信號(hào)處理方式采用缺省或忽略)。其他可能要做的無(wú)非是與信號(hào)集相關(guān)的幾種操作。實(shí)例一:信號(hào)發(fā)送及處理 實(shí)現(xiàn)一個(gè)信號(hào)接收程序sigreceive(其中信號(hào)安裝由sigaction())。 include include sys/include void new_op(int,siginfo_t*,void*)。int main(int argc,char**argv){ struct sigaction act。 int sig。 sig=atoi(argv[1])。 sigemptyset(amp。)。 =SA_SIGINFO。 =new_op。 if(sigaction(sig,amp。act,NULL) 0) { printf(install sigal error\n)。 } while(1) { sleep(2)。 printf(wait for the signal\n)。 }}void new_op(int signum,siginfo_t *info,void *myact){ printf(receive signal %d, signum)。 sleep(5)。}說(shuō)明,命令行參數(shù)為信號(hào)值,后臺(tái)運(yùn)行sigreceive signo amp。,可獲得該進(jìn)程的ID,假設(shè)為pid,然后再另一終端上運(yùn)行kill s signo pid驗(yàn)證信號(hào)的發(fā)送接收及處理。同時(shí),可驗(yàn)證信號(hào)的排隊(duì)問(wèn)題。 注:可以用si
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1