linux的基础知识——时序竞态

1.pause函数

在这里插入图片描述

1.1 pause函数例子

\qquad 程序依次从1到无穷输出数字,当遇到100的整数倍时就暂停,键盘输入ctrl+c,就继续输出。

#include<stdio.h>
#include<signal.h>
#include<unistd.h>

void docatch(int signo)
{
 printf("信号已被捕捉\n");
}

int main()
{
 int i;
 signal(SIGINT,docatch);
 for(i=0; ;i++){
      if(i%100==0){
       pause();
      }
      else{
       printf("%d\n",i);
      }
 }
 return 0;
}
2.时序问题

在这里插入图片描述

3.解决时序问题

在这里插入图片描述

4.例子:sigsuspend函数的举例

\qquad 使用alarm函数和sigsuspend函数实现sleep函数功能

#include<stdio.h>
#include<stdlib.h>
#include<error.h>
#include<unistd.h>
#include<signal.h>

void catch_sigalrm(int signo)
{
        ;
}

unsigned int mysleep(unsigned int seconds)
{
        struct sigaction newact,oldact;
        sigset_t newmask,oldmask,suspmask;
        unsigned int unslept;

        newact.sa_handler = catch_sigalrm;
        sigemptyset(&newact.sa_mask);
        newact.sa_flags = 0;
        sigaction(SIGALRM,&newact,&oldact);

        sigemptyset(&newmask);
        sigaddset(&newmask,SIGALRM);
        sigprocmask(SIG_BLOCK,&newmask,&oldmask);

        alarm(seconds);

        suspmask = oldmask;
        sigdelset(&suspmask,SIGALRM);

        sigsuspend(&suspmask);

        unslept = alarm(0);
        sigaction(SIGALRM,&oldact,NULL);

        sigprocmask(SIG_SETMASK,&oldmask,NULL);

        return(unslept);
}

int main()
{
        int i;
        for(i=0;i<5;i++){
                printf("hello\n");
                mysleep(2);
        }
        return 0;
}
5.总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值