无论你是否给他信号,这个状态都已经设定。
这个代码先block SIGINT, 然后sleep 10秒等待信号. 10秒后,检查10秒内是否输入了SIGINT信号.(如果输入了,会被block, handler不会被调用, sleep会被中断.). 不管如何,随后立即解除对SIGINT的block. 最后,进入死循环,这时如果ctrl+C, 会发现 handler能被调用.
相同点:消息和信号的运用都可以为任务事件驱动
不同点:
1、信号只能是固定的几个(如SIGINT),且接收对象只能是进程。而消息的对象可以是进程,也可以为线程。
2、信号不需要创建,系统是识别的,用kill -l 可以查看完整的信号列表,没有大小的讨论。消息需要申请消息队列资源,返回的是消息队列的句柄,打进的消息体长度、消息的数量、消息队列总的容量只受系统消息队列配置大小的限制。
3、消息在linux系统中,由用户层进入内核层队列,全为复制 *** 作,代价是4次拷贝。信号也需要调用系统调用,但信号本身成本低。
4、另外信号的使用会使阻塞的进程被中断掉。而消息没有这个功能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)