社区
C++ 语言
帖子详情
关于信号挂起系统函数
loud1984
2009-07-22 10:57:17
linux环境:Pause(),sigpause(),sigsuspend(),sigwait()说下这几下
等待信号类型和数量 函数是否被阻塞信号中断 调用时是否改变信号掩码 返回时是否恢复原信号掩码 。
找了些资料说得乱七八糟的,多谢!!!
...全文
247
4
打赏
收藏
关于信号挂起系统函数
linux环境:Pause(),sigpause(),sigsuspend(),sigwait()说下这几下 等待信号类型和数量 函数是否被阻塞信号中断 调用时是否改变信号掩码 返回时是否恢复原信号掩码 。 找了些资料说得乱七八糟的,多谢!!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Treazy
2009-07-22
打赏
举报
回复
sigwait()
函数可从set 中自动选择和清除未决的信号,并返回sig 指向的位置中的信号的编号。
如果在调用时set中没有未决的信号,则调用线程将被挂起,
直至一个或多个信号成为未决信号,或线程被某一未阻塞的已捕获信号中断为止。
在调用sigwait() 时,应阻塞set 中的信号。否则,此行为是未定义的。
如果有多个信号排队等待获取选择的信号编号,
则sigwait() 将与第一个排队信号返回,而剩余信号将继续排队。
如果选择了范围SIGRTMIN 至SIGRTMAX 中多个未决信号中的任意一个,
则将返回编号最小的信号。未指定实时信号和非实时信号之间,或多个未决非实时信号之间的选择顺序。
如果某进程中的多个线程在sigwait() 中等待同一信号,则仅有一个进程从sigwait() 中返回信号编号;
尚未定义返回的线程。
线程注意事项
通过例行程序的sigwait 系列,线程可以同步等待多个信号。
这使sigwait 例行程序适于在多线程进程中处理信号。对于在多线程进程中处理信号的建议方法是,
使所有线程都阻塞相关信号,并专门使用一个线程调用sigwait函数,以等待接收信号。
如果某信号导致sigwait 函数返回,则可将处理信号的代码紧跟在sigwait 例行程序返回的结果后面。
处理信号之后,可以再次调用sigwait 函数,等待接收其他信号。
为确保使用专用线程处理信号,要切记使所有线程(包括发出sigwait 调用的线程)都阻塞相关信号。
否则,信号可能会被传递到除专用信号处理线程以外的其他线程。这可能会导致对信号执行缺省操作。
重要的是要使发出sigwait 调用的线程也受阻塞的信号。
这将防止在专用信号处理线程位于sigwait 函数的各调用之间时,执行缺省信号操作。
Treazy
2009-07-22
打赏
举报
回复
pause()
用于挂起调用进程,直至其收到信号为止。信号不可是当前被调用进程设为忽略或阻塞(屏蔽)的信号。
如果信号使调用进程终止,则pause() 不会返回。
如果信号被调用进程捕获,并且从信号捕获函数返回控制,则调用进程从挂起点恢复执行;
并且从pause() 返回值-1,同时将errno 设为EINTR 。
线程注意事项
信号配置(例如捕获/缺省/忽略)由进程中的所有线程共享,并且每个线程都维护阻塞的信号掩码。
因此,正被等待的信号不应被进程忽略,或被调用线程阻塞。
在收到信号之前, pause() 将仅挂起调用线程。
如果进程中的其他线程不受阻塞的信号,则信号可能会传递到进程中的其他线程,同时pause() 中的线程可能会继续等待。
为此,对于多线程应用程序,建议使用sigwait() 而不是pause() 。
sigpause()
函数从调用进程的信号掩码中删除sig 并挂起调用进程直到接收到信号。
若要具有更广泛的可移植性,应相对于sigpause() 优先使用sigsuspend() 函数。
sigpause() 函数挂起调用进程,直到接收未阻塞的信号。如果保留了信号sig,则该信号会在进程暂停前释放。
sigpause() 用于在发生信号时测试更改的变量。
例如,应首先使用sighold() 来阻塞该信号,然后测试该变量。
如果都没有发生更改,则调用sigpause() 以等待该信号。
sigsuspend()
函数可将调用线程的当前信号掩码替换为sigmask 指向的信号集,然后挂起该线程,
直到传递一个信号为止,该信号的操作将是执行信号捕获函数或终止进程。
这不会导致在进程上一直未决的任何其他信号成为线程上未决的信号。
如果该操作是要终止进程,则sigsuspend() 将永远不会返回。
如果操作是要执行信号捕获函数,则sigsuspend()将在信号捕获函数返回后返回,
同时信号掩码恢复为调用sigsuspend() 之前已存在的信号集。
不能阻塞无法忽略的信号。这是系统强制的,不会导致显示错误。
线程注意事项
由于受阻塞的信号掩码在线程级进行维护,因此sigsuspend() 仅修改调用线程的受阻塞的信号掩码。sigsuspend()仅挂起调用线程直到它接收到信号为止。
如果进程中的其他线程未受阻塞的信号,则此信号可以传递到进程中的另一线程,而sigsuspend() 中的线程会继续等待。
由于此原因,对于多线程应用程序,建议使用sigwait() ,而不是sigsuspend() 。
seasonjie
2009-07-22
打赏
举报
回复
帮顶
大前置
2009-07-22
打赏
举报
回复
帮顶
Linux进程操作(
信号
及
信号
处理--
信号
处理
函数
)
信号
及
信号
处理
信号
处理
函数
设置
信号
处理
函数
发送
信号
向进程本身发送
信号
设置Linux定时器定时等待I/O
挂起
进程
信号
处理
函数
设置
信号
处理
函数
Linux使用 signal
函数
将处理
函数
加载,并且通知
系统
,其
函数
原型为: #include<signal.h> void (*signal (int signo,void(* func)(int))) (int); 参数说明: signal : 需要加载处理的
信号
的编号,例如SIGKILL; func : 是一个
函数
指针,这个
函数
捕捉第一个函
系统
编程 day08
信号
函数
(
信号
量的使用方法,申请
信号
量初始化
信号
量 销毁
信号
的
函数
(signal
信号
捕捉
函数
)
sem_wait
函数
可以测试所指定
信号
灯的值,调用
函数
sem_post()增加
信号
量。只有当
信号
量值大于0时,
函数
sem_wait()才能返回,并将
信号
量的值减1,当
信号
量等于0时,sem_wait()将被阻塞直到
信号
量的值大于0。sem_wait与sem_trywait的区别: sem_wait和sem_trywait相当于P操作,它们都能将
信号
量的值减一,两者的区别在于若
信号
量小于零时,......
【操作
系统
】
信号
处理与阻塞
函数
|时序竞态问题
🔥❤️阻塞
函数
处于等待状态,等待
系统
通知或事件消息,如果接收到
信号
,
信号
处理
函数
会中断阻塞
函数
的执行。这可能导致阻塞
函数
提前返回。
linux
系统
编程
挂起
pause() 、睡眠sleep()
1 /* 2 pause()头文件 #include<unistd.h> 3 原型: int pause(void); 4 返回值:-1并设置error为EINTR 5 1.如果
信号
的默认处理动作是终止进程,则进程终止,pause
函数
没有机会返回 6 2.如果
信号
的默认处理动作是忽略,进程进行处于
挂起
状态,pause
函数
不返回 7 ##3.如果
信号
的处理动作是捕捉,则调用完
信号
处理
函数
后 8 pause返回-1,error设置为EINTR,表示被
信号
中...
4-任务的
挂起
与解挂
UCOSIII 任务的
挂起
与解挂 当某个任务在等待一些事情的时候,比如
信号
量、消息队列(以后会用到的)等,或者调用延时
函数
,该任务会进入
挂起
的状态,但是这是
系统
自动把任务
挂起
来的,不需要我们手动干预。虽然
系统
很多时候都可以把任务
挂起
来,但是有时候我们想手动把任务
挂起
来了该怎么办呢,其实UCOS已经给我们预留了任务
挂起
和解挂的API
函数
, 1、OSTaskSuspend() 2、OSTa...
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章