pause函数

pause函数

       调用该函数可以造成进程主动挂起,等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃cpu) 直到有信号递达将其唤醒。

    int pause(void);     返回值:-1 并设置errno为EINTR

       返回值:

① 如果信号的默认处理动作是终止进程,则进程终止,pause函数么有机会返回。

              ② 如果信号的默认处理动作是忽略,进程继续处于挂起状态,pause函数不返回。

              ③ 如果信号的处理动作是捕捉,则【调用完信号处理函数之后,pause返回-1】

                 errno设置为EINTR,表示“被信号中断”。想想我们还有哪个函数只有出错返回值。

              ④ pause收到的信号不能被屏蔽,如果被屏蔽,那么pause就不能被唤醒。

 

练习:使用pause和alarm来实现sleep函数。                                                                                 【mysleep.c】

注意,unslept = alarm(0)的用法。

例如:睡觉,alarm(10)闹铃。  

正常: 10后闹铃将我唤醒,这时额外设置alarm(0)取消闹铃,不会出错。

              异常: 5分钟,被其他事物吵醒,alarm(0)取消闹铃防止打扰。

复制代码
/***
pause.c
***/
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>

void catch_sigalrm(int signo)
{
    ;
}

unsigned int mysleep(unsigned int seconds)
{
    int ret;
    struct sigaction act,oldact;
    
    act.sa_handler = catch_sigalrm;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    
    ret = sigaction(SIGALRM,&act,&oldact);
    if(-1 == ret)
    {
        perror("sigaction error");
        exit(1);
    }

    alarm(seconds);
    ret = pause();
    if(-1 == ret && errno == EINTR)
    {
        printf("pauses success\n");
    }

    ret =alarm(0);
    sigaction(SIGALRM,&oldact,NULL);
    
    return ret;
}

int main()
{
    while(1)
    {
        mysleep(3);
        printf("-----------\n");
    }
    return 0;
}
复制代码

 

posted @   王清河  阅读(1957)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2018-08-11 1025 PAT Ranking (25)
点击右上角即可分享
微信分享提示