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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux信号 四 异步等待信号与同步等待信号接口

發(fā)布時間:2025/4/5 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux信号 四 异步等待信号与同步等待信号接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

信號的同步等待和異步等待區(qū)別就是信號處理函數(shù)的執(zhí)行與否,異步等待是信號處理函數(shù)已經(jīng)執(zhí)行了,同步等待是信號處理函數(shù)還沒有執(zhí)行。

異步等待接口:pause() 和 sigsuspend()

1. pause()

/*** 等待信號* pause()函數(shù)將調(diào)用進(jìn)程/線程掛起,使之進(jìn)入可中斷的睡眠狀態(tài),直到傳遞了一個信號為止。* 這個信號的動作或者是執(zhí)行用戶定義的信號處理函數(shù),或者是終止進(jìn)程。如果執(zhí)行用戶定義的* 信號處理函數(shù),pause()會在信號處理函數(shù)執(zhí)行完畢后返回,如果是終止進(jìn)程,pause()函數(shù)* 就不返回了,如果內(nèi)核發(fā)出的信號被忽略,那么就不會被喚醒。* * 成功返回-1,并置errno為EINTER.** pause函數(shù)并不能區(qū)分是什么信號觸發(fā)中斷,所以不能使用pause函數(shù)來等待特定的信號。*/ #include <unistd.h> int pause(void);

2. sigsuspend()

/*** 等待特定信號** sigsuspend暫時使用參數(shù)mask替換調(diào)用進(jìn)程/線程的信號掩碼,并且阻塞直到特定信號* 發(fā)生。如果信號終結(jié)了進(jìn)程,sigsuspend函數(shù)不返回,如果信號被捕獲,則sigsuspend* 會等到信號處理函數(shù)執(zhí)行完成后才返回,并且調(diào)用進(jìn)程/線程的信號掩碼會恢復(fù)到調(diào)用之前* 的樣子。* 信號SIGKILL 和 SIGSTOP是無法阻塞的。* 返回值-1,錯誤碼可以是EINTR(信號中斷)或者EFAULT(參數(shù)錯誤)**/ #include <signal.h> int sigsuspend(const sigset_t *mask);

同步信號接收接口有兩類:

1. sigwait() 、sigwaitinfo()、sigtimedwait(),這三個函數(shù)接口略有差異,做的事情類似。都是等待特定信號,如果沒有信號則掛起當(dāng)前進(jìn)程,有的話立即返回。

/*** 等待信號發(fā)生* * 成功返回0,并將信號值存儲到參數(shù)set中,失敗返回一個正的錯誤碼。* */ #include <signal.h> int sigwait(const sigset_t *set, int *sig);

?

/*** 等待信號返回* * 當(dāng)參數(shù)第二個siginfo_t不為空時,內(nèi)核會將關(guān)于該信號更詳細(xì)的信息存儲到該指針指向地址,* 如果有多個信號滿足條件,sigwaitinfo只會返回其中一個。* 成功返回信號值,失敗返回-1并置errno* */ #include <signal.h> int sigwaitinfo(const sigset_t *set, siginfo_t *info);/*** 和sigwaitinfo功能一樣,只是多了一個時間參數(shù),超時未等到信號立即返回,* 如果時間參數(shù)timeout為NULL,則和sigwaitinfo一樣。* 如果timeout兩個參數(shù)為0,那么sigtimedwait會立即返回。**/struct timespec {long tv_sec; /* seconds */long tv_nsec; /* nanoseconds */ }int sigtimedwait(const sigset_t *set, siginfo_t *info,const struct timespec *timeout);

通常調(diào)用上述接口前都需要先調(diào)用sigprocmask接口將關(guān)注的信號屏蔽,防止被信號處理函數(shù)劫走。

2. Linux還提供了另外一種同步等待信號接口 signalfd

/*** 創(chuàng)建一個用于接收信號的文件描述符。** 參數(shù)fd = -1時,該函數(shù)會創(chuàng)建一個文件描述符。* fd != -1,表示修改操作,一般是修改mask的值,此時fd是之前signalfd的* 返回值** 參數(shù)mask表示信號集,關(guān)注的信號集合。這些信號的集合應(yīng)該在調(diào)用signalfd函數(shù)* 之前,先調(diào)用sigprocmask函數(shù)阻塞這些信號,防止被信號處理函數(shù)劫走。** 參數(shù)flags用來控制行為,目前支持的標(biāo)志位如下:* SFD_CLOEXEC :和普通文件的O_CLOEXEC一樣,調(diào)用exec函數(shù)時,文件描述符* 會被關(guān)閉。* SFD_NONBLOCK : 控制將來的讀取操作,如果執(zhí)行read操作時,并沒有信號到來,* 則立即返回失敗,并設(shè)置errno為EAGAIN。** 成功返回文件描述符fd,失敗返回-1并置errno** 返回的描述符fd可用于poll,epoll,select等函數(shù),用來檢測描述符fd上面的可讀* 事件。* * 創(chuàng)建文件描述符后,可以使用read函數(shù)來讀取到來的信號。提供的緩沖區(qū)大小最少要* 放下一個signalfd_siginfo結(jié)構(gòu)體,該結(jié)構(gòu)體如下,如果有多個信號返回,read會* 返回多個該結(jié)構(gòu)體大小的字節(jié)數(shù)。*/ #include <sys/signalfd.h> int signalfd(int fd, const sigset_t *mask, int flags);struct signalfd_siginfo {uint32_t ssi_signo; /* Signal number */int32_t ssi_errno; /* Error number (unused) */int32_t ssi_code; /* Signal code */uint32_t ssi_pid; /* PID of sender */uint32_t ssi_uid; /* Real UID of sender */int32_t ssi_fd; /* File descriptor (SIGIO) */uint32_t ssi_tid; /* Kernel timer ID (POSIX timers)uint32_t ssi_band; /* Band event (SIGIO) */uint32_t ssi_overrun; /* POSIX timer overrun count */uint32_t ssi_trapno; /* Trap number that caused signal */int32_t ssi_status; /* Exit status or signal (SIGCHLD) */int32_t ssi_int; /* Integer sent by sigqueue(3) */uint64_t ssi_ptr; /* Pointer sent by sigqueue(3) */uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */uint64_t ssi_stime; /* System CPU time consumed(SIGCHLD) */uint64_t ssi_addr; /* Address that generated signal(for hardware-generated signals) */uint16_t ssi_addr_lsb; /* Least significant bit of address(SIGBUS; since Linux 2.6.37)uint8_t pad[X]; /* Pad size to 128 bytes (allow foradditional fields in the future) */ };

signalfd創(chuàng)建的文件描述符使用完成之后要調(diào)用close函數(shù)來關(guān)閉該文件描述符:

/* 關(guān)閉文件描述符 */ close(fd);

參考資料:

1. 《Linux環(huán)境編程,從應(yīng)用到內(nèi)核》 高峰,李彬著

2. man signalfd : http://www.man7.org/linux/man-pages/man2/signalfd.2.html

總結(jié)

以上是生活随笔為你收集整理的Linux信号 四 异步等待信号与同步等待信号接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕在线官网 | 男女日批免费视频 | 99在线精品视频免费观看软件 | 久久久精品免费 | 久久久久成人精品无码中文字幕 | 日韩经典在线观看 | 强行挺进白丝老师翘臀网站 | 国产100页| 免费福利在线观看 | 钻石午夜影院 | 四虎在线视频免费观看 | 丁香av| 波多一区二区 | 午夜精品久久久久久99热 | 成人av免费在线播放 | 国产1区在线| 黄色视屏在线播放 | 麻豆网站在线看 | 香蕉午夜视频 | 中文字幕福利视频 | 国产精品av在线 | 亚洲色图吧 | 伊人久久成人 | 色综合一区二区三区 | 日韩中文字幕在线观看 | 久久综合99 | 国产九九热视频 | 成人国产欧美 | 亚洲乱码国产乱码精品精软件 | 国产成人在线精品 | 宿舍女女闺蜜调教羞辱 | 伊人成人22 | 免费国产在线视频 | 久久久亚洲av波多野结衣 | 日本污视频在线观看 | 欧美做爰爽爽爽爽爽爽 | 久久久久久久久久久国产 | 欧美成人91 | 手机看片福利久久 | 日本黄色网络 | 日韩精品高清视频 | 亚洲最大看欧美片网站 | 中文字幕第十一页 | 欧美日韩在线影院 | 无码人妻精品一区二区 | 亚州| 伊人免费在线 | 国产精品一品 | 国产精品一区久久久 | 六月丁香在线视频 | 一区二区三区四区av | 亚洲色图丝袜美腿 | 青青草国产一区 | 国精产品一区一区三区在线 | 久久精品不卡 | 精品国产乱码久久久久久郑州公司 | 日本黄页网站免费大全 | 国产一级一片免费播放放a 丁香六月色 | 天天摸天天舔天天操 | 中文字幕欲求不满 | 色综合色综合色综合 | 神马午夜在线 | 摸大乳喷奶水www视频 | 日韩少妇内射免费播放18禁裸乳 | 国产crm系统91在线 | 天天干天天天天 | 噜噜噜亚洲色成人网站 | 午夜精品一区二区三区在线观看 | 国产精品视频久久久久久 | 日韩理论片在线观看 | 国产美女久久久 | 免费看91 | 欧美小视频在线 | 四虎国产成人精品免费一女五男 | 人人超碰97 | 刘亦菲毛片一区二区三区 | 成人亚洲玉足脚交系列 | 国产精品一二区 | 这里只有精品视频 | 日韩不卡在线观看 | 欧美亚洲第一页 | 无码精品黑人一区二区三区 | 操极品| 天堂网资源 | 精品人伦一区二区三区蜜桃网站 | 中文日韩在线观看 | 久久国产综合 | 都市激情麻豆 | 星铁乱淫h侵犯h文 | 深夜久久久| 在线观看日韩中文字幕 | 欧美日韩激情在线一区二区三区 | 影音先锋男人天堂 | 男受被做哭激烈娇喘gv视频 | 日本在线观看一区二区 | 国产午夜无码精品免费看奶水 | 日韩中文字幕一区二区三区 | 中国人与拘一级毛片 | 懂色av中文一区二区三区天美 |