【Linux】利用信号实现sleep函数

本文通过信号机制模拟实现sleep函数,深入探讨了sigaction、pause和sigsuspend等函数的使用,并分析了mysleep1和mysleep2的实现及存在的竞态条件问题。通过对SIGALRM信号的处理,解决了进程被抢占CPU资源可能导致的错误。
摘要由CSDN通过智能技术生成

在另一篇文章Linux信号中,介绍了信号的产生与处理方式,以及一系列信号集函数的使用。
本文使用信号机制,模拟实现sleep函数并了解竞态条件。

在此之前先介绍一波需要用到的函数。

sigaction函数

#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

可以读取和修改于指定信号相关联的处理动作。
参数 signnum 为指定信号的编号。
若act指针非空,则根据 act 修改信号的处理动作,oldact可以为空,或者传出原来的处理动作。act和oldact都指向下面的结构体:

struct sigaction
{
    void    (*sa_handler) (int) // 信号处理函数  SIG_IGN 表示忽略 SIG_DFL 表示默认动作
    sigset_t sa_mask;  // 额外要屏蔽信号集
    int     sa_flags;  // 一般为0
    void (*sa_sigaction)(int, siginfo_t *, void *); // 实时信号处理函数
}

当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字。保证在处理某个信号时,如果这种信号再次产生,那么它会被阻塞到当前处理结束为止。如

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值