linux系统编程之信号(六):竞态条件与sigsuspend函数

本文介绍了如何利用pause和alarm实现sleep函数,以及在实现过程中遇到的竞态条件问题。通过分析mysleep函数的时序,揭示了因异步事件可能导致的错误——竞态条件。文章提出了解决方案,引入了sigsuspend函数,它能够避免竞态条件并确保原子性操作,提供了一种更安全的方法来替代pause。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、利用pause和alarm函数实现sleep函数

#include <unistd.h>

int pause(void);
pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为EINTR,所以pause只有出错的返回值。错误码EINTR表示“被信号中断”。

alarm函数可以参考这里

下面使用pause和alarm实现sleep(3)函数,称为mysleep:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<stdio.h>
#include<signal.h>
#include<unistd.h>

void sig_alrm( int signo)
{
     /* nothing to do */
}


unsigned  int mysleep( unsigned  int nsecs)
{
     struct sigaction newact, oldact;
     unsigned  int
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值