日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unix信号处理一些笔记

發布時間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unix信号处理一些笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

從信號到線程,然后再到線程中的信號,再然后就是守護進程中關于信號的一些個實例,一堆系統調用,有點迷茫,貌似又有一線線索在串起這些個知識點,嗯,就先把這些知識點寫出來,再總結吧。

1、進程的信號屏蔽字:規定了進程當前要阻塞的信號集。

? ? ?sigprocmask調用就是設置當前進程的信號屏蔽字的,但要注意,該調用對基于線程的信號處理是無效的(后面將提及,pthread_sigmask調用才是針對線程的信號屏蔽字的設置)。

2、如果有信號被阻塞,也就是未決狀態的信號,那么可以調用sigpending取得當前所有的未決信號集,多次發生的信號會被認為是發生了一次,并寫入sigpending傳入的參數指針指向的內存中。注,這時這些信號仍舊是未決狀態,sigpending所做的就是查詢一下當前有哪些信號被block掉了。

3、有什么辦法可以臨時解除某些信號的屏蔽,并等待這些信號的發生,在這些信號發生后,調用進程停止等待,繼續執行,并恢復原先的信號屏蔽設置呢?有的,就是sigsuspend,該調用臨時設置參數指定屏蔽字為當前進程的信號屏蔽字,在捕捉到一個信號或者發生了一個會終止該進程的信號之前,該進程被掛起,如果捕捉到一個信號而且從該信號處理程序返回,則sigsuspend返回,并且將該進程的信號屏蔽字設置為調用sigsuspend之前的值。

下面一個例子:

void sig_usr(int signo) {// do some things about signal }int main(int argc, char *argv[]) {sigset_t global_mask;sigset_t tmp_mask;if (SIG_ERR == signal(SIGUSR1, sig_usr)) {perror("signal error");exit(1);}// block all signalssigfillset(&global_mask);sigprocmask(SIG_BLOCK, &global_mask, NULL);// unblock SIGUSR1 temporarilysigfillset(&tmp_mask);sigdelset(&tmp_mask, SIGUSR1);sigsuspend(&tmp_mask);printf("after sigsuspend.....\n");return 0; }上面的例子的意思是,屏蔽所有的信號,僅只處理SIGUSR1信號一次,注意,這里必須為SIGUSR1信號設置信號處理程序,否則,該程序就不會在sigsuspend之后返回了。

sigsuspend一般都是用來做進程同步用的,進程間通過發送信號告訴對方它自己已經準備好了,常常是接收信號的一方要等待對方的信號,所以一般都會使用sigsuspend來等待。但是要注意了,在等待這些信號之前,就必須要先把這些信號屏蔽了,否則就會產生一個時間窗口,在sigsuspend之前就錯過了信號了(如果這個信號永遠都不再發生,那么這個進程就永遠阻塞)。在APUE中有這樣的一個例子,就是進程間的同步,在for之前就把信號屏蔽好了,然后再fork,各個子進程然后再sigsuspend,這樣就會不錯過信號了。

注意,以上所講述的調用,僅只針對進程,而在線程中則無效的。

4、線程中關于信號的機制(建議看FreeBSD的manpages,Linux的manpages是Posix定義的,太TMD暈了)

(1)每個線程都有自己的信號屏蔽字,新被創建的線程繼承創建者線程的信號屏蔽字(副本),?他們須通過pthread_sigmask來設置自己的信號屏蔽字(包括main在內)。

(2)信號處理是進程中所有線程共享的,也就是說,任何一個線程改變了信號的處理方法,都影響其它線程。如果信號與硬件故障或計時器超時相關,該信號就被發送到引起該事件的線程中去。其它信號則被發送到任意一個線程(在Linux中,就是當前進程的第一個線程-_-|||)。

(3)在線程處理中,與sigsuspend(進程)相似的調用是sigwait,但是它功能就強多了,語義上也有所不同,首先,它第一個參數的意思是要等待信號集(sigsuspend則是把第一個參數信號集臨時設為當前進程的信號屏蔽字,意思是相反的),然后,第二個參數是取得當前等待得到的信號(這一點,sigsuspend是做不到的)。

? ? sigwait的機制是:sigwait調用會自動取消傳入參數信號集的阻塞狀態,直到有新的信號被遞送,而在sigwait返回之前,它會把該等待到的信號從未決的信號集中去除,并恢復線程的信號屏蔽字。(APUE中文版關于這部份的翻譯是錯的,請看英文版相關的描述。)。

? ? 如果信號被捕獲,而線而又正在用sigwait來等待該信號呢?那么這時就將由操作系統實現來決定以何種方式來遞關信號了,要么就遞送給sigwait,要么就遞送給信號處理程序,但僅只能選擇其中一種方式(在開發時,最后還是僅選擇一種方式)。而sigsuspend則必須等待信號處理程序返回。

? ? sigwait常用的用法就是,使用一個專門的線程來處理信號,而不像進程那樣使用signal調用來設置handler。這是相當有用的用法,進程在一開始就屏蔽所有信號,然后建立一個線程sigwait信號,然后就是while true 和switch了。

下面有一個例子:

void *signal_handler(void *args) {sigset_t mask;int signo;// wait all signalssigfillset(&mask);while(1) {sigwait(&mask, &signo);switch (signo) {case SIGUSR1:// SIGUSR1 handlerbreak;case SIGINT:// SIGINT handlerbreak;.....default:fprintf(stderr, "unexpected signal %d\n", signo);break;}}return (void *) 0; }int main(int argc, char *argv[]) {pthread_t tid;sigset_t mask;// mask all signalssigfillset(&mask);pthread_sigmask(SIG_BLOCK, &mask, NULL);pthread_create(&tid, NULL, signal_handler, NULL);while (1) {printf("main thread: I am working......\n");sleep(1);}return 0; }

5、那么線程的同步呢?哦,不應該叫同步,而應該叫通信。其實有另外的幾種辦法,一個是pthread_cond_broadcast,條件廣播,另一種就是利用線程sigwait,向指定線程發送信號pthread_kill。(本文未完,還欠代碼未寫,-_-||趕著洗碗去了)

轉載于:https://my.oschina.net/kut/blog/30120

總結

以上是生活随笔為你收集整理的Unix信号处理一些笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产88av| 日本中文不卡 | 婷婷91 | 日韩午夜激情电影 | 深夜成人在线 | 日韩在线视频网站 | 久久看毛片| 韩国一级淫片免费看 | 热热热热色 | 在线成人免费电影 | 九九碰| www.亚洲| 成人在线不卡视频 | 人妻精品久久久久中文字幕 | 欧美色v| 三级麻豆| www.九九热 | 啪啪亚洲 | 欧美黄色一级网站 | jizz日本在线播放 | 亚洲精品人妻av | 91超薄肉色丝袜交足高跟凉鞋 | 日本高清精品 | 欧美日韩四区 | 午夜黄色在线 | 全部免费毛片 | 精品一区二区三区免费看 | 久草影视网 | 国产精品一区二区av | 亚洲乱码国产乱码精品精剪 | 欧美日韩一卡二卡三卡 | 综合av第一页 | 久久久国产成人一区二区三区 | 欧美亚洲在线观看 | 国模在线 | 不卡的毛片 | 欧美成人三级视频 | 久久精品精品 | 黄色av中文字幕 | 亚洲清纯国产 | 黄片毛片一级 | kendra lust free xxx | 国产精久久久久久 | 67194午夜 | 老师上课夹震蛋高潮了 | 国产精品久久久久久久久久久不卡 | av看片资源 | 激情欧美一区二区三区精品 | 黄网在线免费观看 | 最新不卡av | 久一久久 | 秋霞啪啪片 | 国产精品视频久久 | 中文精品在线 | 精品国产乱码一区二区三 | 中国女人裸体乱淫 | 日韩欧美一区在线观看 | 麻豆精品免费 | 视频福利在线观看 | av尤物在线 | 国内久久精品 | 澳门三级 | 欧美无玛| 又粗又猛又爽又黄的视频 | 丰满大乳奶做爰ⅹxx视频 | 欧美三级韩国三级日本三斤在线观看 | www.国产黄色| 老司机成人网 | 激情六月色 | 亚洲视频入口 | 日韩电影在线一区二区 | 欧美蜜臀| 午夜视频在线观看一区二区 | 在线免费观看的av | 日本黄色特级片 | 日本三级久久 | 69xx视频在线观看 | 在线成人免费视频 | 精品久久影视 | 亚洲福利视频网站 | 熟妇人妻一区二区三区四区 | 日韩美女视频一区 | 欧美熟妇激情一区二区三区 | 成人四色 | sm在线观看| 91久久精品国产 | 女人的天堂av | 日本在线中文字幕专区 | 天天视频黄色 | 国产精品久久久久9999爆乳 | 小向美奈子在线观看 | 中文字幕一区二区三区人妻四季 | 懂色av蜜臀av粉嫩av分 | 熟妇高潮一区二区三区 | 激情五月色婷婷 | 欧美大片高清 | 欧美a级黄色片 | 久久精品大片 | 亚洲黄色中文字幕 |