• pause函数:

       功能:让进程暂停直到信号出现

    #include<unistd.h>

       intpause();

     函数说明:pause()会令目前的进程暂停(进入睡眠状态),直至信号(signal)所中断。

   返回值:只返回-1。

#include<stdio.h>
#include<unistd.h> void deal()
{
printf(“信号干扰!\n”);
}
void main()
{
printf(“进程执行!\n”);
signal(SIGINT,deal);
pause();
printf(“进程结束!\n”);
}

说明:

当程序运行时,pause会使当前的进程挂起(进入睡眠状态),直到我们向该进程发送SIGINT中断信号,进程才会被唤醒,并处理信号,处理完信号后pause函数才返回,并继续运行该程序。

注:任何信号都可使pause唤醒。

  • sigsuspend函数:

   #include<signal.h>

int sigsuspend(const sigset_t *sigmask);

返回值:-1,并将errno设置为EINTR

sigsuspend函数和pause函数一样,可以是进程挂起(进入睡眠状态),直至有信号发生。

sigsuspend函数的参数是一个信号集,这个信号集是用来屏蔽信号的,信号集中存放了要屏蔽的信号。

如果该信号集为空的话,sigsuspend就不屏蔽任何信号,任何信号都可以使进程从挂起状态唤醒,这就与pause函数一样了。

#include<stdio.h>
#include<unistd.h>
#include<signal.h> void deal()
{
printf(“信号干扰!\n”);
}
void main()
{
sigset_tsigmask;
sigemptyset(&sigmask); printf(“进程执行!\n”);
signal(SIGINT,deal);
sigsuspend(&sigmask);
printf(“进程结束!\n”);
}

说明:

该例子与上面pause函数的例子是一样的。

  • sigsuspend与pause的不同处:

sigsuspend函数是pause函数的增强版。当sigsuspend函数的参数信号集为空信号集时,sigsuspend函数是和pause函数是一样的,可以接受任何信号的中断。但是,sigsuspend函数可以屏蔽信号,接受指定的信号中断。

sigsuspend函数=pause函数+指定屏蔽信号

注:信号中断的是sigsuspend和pause函数,不是程序代码。

sigsuspend是否影响sigprocmask屏蔽的信号呢?

影响!sigsuspend使原来的屏蔽信号全部失效,当sigsuspend返回,恢复原来的屏蔽信号。

  • sigsuspend什么时候使用?

当我们的程序在进行一些业务处理的时候不想被一些信号所中断,我们就可以先屏蔽这些信号,在这个业务处理结束时我们可以使用sigsuspend函数处理在排队的信号(在这个过程中也可指定屏蔽的信号),处理完成后,在恢复之前的信号屏蔽,并处理下个业务处理。

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void deal()
{
printf(“信号处理中!\n”);
}
void main()
{
sigset_t sigs,sigmask;
int i;
signal(SIGINT,deal);
sigemptyset(&sigs); //sigsuspend的信号集设置空,表示会sigsuspend会处
//理任何信号,如果想在处理排队的信号时屏蔽一些
//信号,可以把相应的信号加到信号集中
sigemptyset(&sigmask);
sigaddset(SIGINT,&sigs);
sigprocmask(SIG_BLOCK,&sigs,); //屏蔽sigint信号,使其不能再业务处理过程
//中干扰进程。
for(i= ; i< ; i++)
{
printf(“处理业务中…..\n”); //模拟业务处理
sleep()
printf(“处理业务结束\n”);
sigsuspend(&sigmask); //处理正在排队的信号,处理信号完毕后,
//sigsuspend函数才返回,并执行下个业务处理
printf(“处理业务中…..\n”); //模拟业务处理
sleep()
printf(“处理业务结束\n”);
}
}

说明:在sigsuspend函数调用时,会使进程挂起(进入睡眠状态)等待信号的中断,如果没有信号发生,进程会一直挂起,当有信号发生时,但该信号不是sigsuspend函数的信号集中所设置的屏蔽的信号时,sigsuspend会处理该信号,当该信号处理完成后,sigsuspend函数才返回,并执行接下来的代码。

Linux C 信号 pause、sigsuspend 的相同与区别的更多相关文章

  1. Linux c 信号—pause、sigsuspend 的相同于区别

    pause函数:      功能:让进程暂停直到信号出现 #include<unistd.h> intpause(); 函数说明:pause()会令目前的进程暂停(进入睡眠状态),直至信号 ...

  2. Linux 等待信号(sigsuspend)

    /* sigsuspend()函数说明 */ #include <stdio.h> #include <signal.h> /* 知识补充: sigsuspend()函数 函数 ...

  3. Linux&C ——信号以及信号处理

    linux信号的简单介绍 信号的捕捉和处理 信号处理函数的返回 信号的发送 信号的屏蔽 一:linux信号的简单介绍. 信号提供给我们一种异步处理事件的方法,由于进程之间彼此的地址空间是独立的,所以进 ...

  4. Linux&C ——信号以及信号处理

    linux信号的简单介绍 信号的捕捉和处理 信号处理函数的返回 信号的发送 信号的屏蔽 一:linux信号的简单介绍. 信号提供给我们一种异步处理事件的方法,由于进程之间彼此的地址空间是独立的,所以进 ...

  5. Linux进程间通信——信号集函数

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  6. linux kill信号列表

    linux kill信号列表 $ kill -l1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL5) SIGTRAP      6) ...

  7. linux 自定义信号

    从来没试过linux自定义信号,查了下,说是系统只提供了SIGUSR1和SIGUSR2两个,就两个够吗?更要命的是如果要自定义信号如#define SIG_MYSIG   ....的话要改内核才行,哥 ...

  8. linux 异步信号的同步处理方式

    关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略.本文首先介绍如何编写安全的异步信号处理函数:然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同 ...

  9. Linux 的信号和线程

    什么是线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,每一个程序都至少 ...

随机推荐

  1. EZchip将推全球首款100核64位ARM A-53芯片

    EZchip将推全球首款100核64位ARM A-53芯片 2015-02-25 16:32:03   来源:互联网    关键字: 将推  全球  64位  arm EZchip日前表示,将准备开发 ...

  2. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  3. Spring基础

    一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...

  4. Spring 框架的架包分析、功能作用、优点,及jar架包简介

    Spring 框架的架包详解    Spring的作用     Spring的优势  由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或 ...

  5. java 集合

    1. 2.for循环的时候会改变角标,所以删除需要--,增加需要++ 3.去除重复元素2(用的实质都是对象的equals方法) 4.Treeset 里面的add方法 5.treeSet里面addstu ...

  6. linux重启mysql无法启动

    如VPS新建后,重启则无法启动,出现类似 Starting MySQL ... * The server quit without updating PID file (/var/run/mysqld ...

  7. C++基本数据类型总结

    一.整形 1.整形有char.short.int.long.long long,这5个也默认为signed XX ; 规则:short至少16位:int至少和short一样:long至少32位,且至少 ...

  8. 解读ASP.NET 5 & MVC6系列(14):View Component

    在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能.但在MVC6中,这一功能得到了 ...

  9. Hibernate 查询方式(HQL/QBC/QBE)汇总

    作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...

  10. Redis设计与实现读书笔记(一) SDS

    作为redis最基础的底层数据结构之一,SDS提供了许多C风格字符串所不具备的功能,为之后redis内存管理提供了许多方便.它们分别是: 二进制安全 减少字符串长度获取时间复杂度 杜绝字符串溢出 减少 ...