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.总结

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zxr916/article/details/111874911