日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美1314| 成人国产精品免费 | 蘑菇视频黄色 | 麻豆免费在线观看视频 | 喷潮在线| 欧美日本一区二区 | 西野翔之公侵犯中文字幕 | 最新色站 | 日本熟妇人妻xxxxx | 国产久草视频 | 欧美三级午夜理伦 | 亚洲图片综合网 | 亚洲国产三级 | xxx久久| 经典毛片 | 国产亚洲激情 | av二区在线 | 国产成人综合亚洲 | 丝袜美腿一区二区三区 | 少妇厨房愉情理伦bd在线观看 | 三级色网 | 能看av的网站 | 姐姐你真棒插曲快来救救我电影 | 中文字幕在线看高清电影 | 91av视频在线| 久久精品综合网 | 激情婷婷六月 | 亚洲综合另类小说 | 国产欧美一区二区三区在线看 | 日本天堂网在线观看 | 欧美综合一区二区三区 | 亚洲精品97久久 | 亚洲日本中文 | 国产一级片一区二区 | 日本电影成人 | 日本激情视频在线 | 九色91在线 | 免费av网站观看 | 激情视频免费在线观看 | 免费看的黄色录像 | 久久性色 | 免费视频久久 | 日韩精品久久久久久久电影99爱 | 五月天在线 | 蜜桃导航-精品导航 | 国产日韩欧美综合 | 欧美黑人多人双交 | 中文字幕伊人 | 欧美精品久久久久久久久 | 国产香蕉在线 | 8x8ⅹ8成人免费视频观看 | 一级做a爱片性色毛片 | 999热精品| 国产精品永久久久久久久久久 | 亚洲第一视频 | 日本丰满大乳奶做爰 | 色综合久久网 | 久久久久久91亚洲精品中文字幕 | 可以在线观看av的网站 | 国产精品丝袜视频 | 91久久久久久久久久久 | 久久露脸国语精品国产91 | 做爰视频毛片视频 | 成年男女免费视频网站 | 黄a网站 | 欧美1区2区3区 | 欧美一区影院 | 97超碰站 | 五月天天色 | 黄色无遮挡网站 | 在线看片网址 | 91国产在线免费观看 | 91av影院| 波多野结衣视频一区二区 | 国产又粗又猛又大爽 | 激情偷拍| 日本做受| 中文字幕麻豆 | 成人福利视频网 | 福利视频免费观看 | 嫩草一二三 | 日韩精彩视频在线观看 | 国模私拍xvideos私拍 | 亚洲 小说 欧美 激情 另类 | 人人爱人人 | 国产伦精品一区二区三区照片91 | 亚洲黄色成人网 | 国产精品理论在线观看 | 青青草国产在线观看 | 精品视频在线观看免费 | 国产精品国产三级国产aⅴ下载 | 欧美成人h | 又黄又高潮的视频 | 青草在线视频 | 日本女人性视频 | 浮生影视在线观看免费 | 免费成人av在线 | 亚洲激情六月 | 秋霞影院午夜伦 |