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>

intsigsuspend(const sigset_t *sigmask);

返回值:-1

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函数处理在排队的信号(在这个过程中也可指定屏蔽的信号),处理完成后,在恢复之前的信号屏蔽,并处理下个业务处理。

例子:

#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,0);  //屏蔽sigint信号,使其不能再业务处理过程中干//扰进程。

for(i=0 ; i<5 ; i++)

{

printf(“处理业务中…..\n”);    //模拟业务处理

sleep(5)

printf(“处理业务结束\n”);

sigsuspend(&sigmask);       //处理正在排队的信号,处理信号完毕后,

//sigsuspend函数才返回,并执行下个业务处理

printf(“处理业务中…..\n”);    //模拟业务处理

sleep(5)

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. zxing源码分析——QR码部分

    Android应用横竖屏切换 zxing源码分析——DataMatrix码部分 zxing源码分析——QR码部分 2013-07-10 17:16:03|  分类: 默认分类 |  标签: |字号大中 ...

  2. jQuery滚动广告 解决子div绝对定位与父div重叠引起的闪烁问题

    这两天做了一个滚动广告栏的demo 功能有自动轮播 左右箭头移动 导航点选中图片移动效果 模仿的是新浪体育的广告 最难的问题就是子div绝对定位于父div 鼠标移入子div 系统会判定鼠标移出了父di ...

  3. 织梦list文章列表按权重排序

    织梦的文章列表按权重排序 DEDECMS(织梦)5.6系统支持文档权重weight排序,可以在模板中使用: {dede:arclist row='10' titlelen='50' orderby=' ...

  4. mysql错误提示不是英语的解决办法

    mysql提示突然就变成法语了,google了一下,找到了解决方法:打开my.ini文件,找到[mysqld]配置项如下 [mysqld] port explicit_defaults_for_tim ...

  5. verilog中=和<=的区别

    一般情况下使用<=,组合逻辑使用=赋值,时序逻辑使用<=赋值: 举个例子:初始化m=1,n=2,p=3:分别执行以下语句 1.begin m=n:n=p:p=m: end 2.begin ...

  6. 汇编写hello world

    .global main main: mov ip, sp stmfd sp!, {fp, ip, lr} sub fp, ip, # ldr r0, =he mov lr, pc b printf ...

  7. 十九、Android Activity初探

    原文:十九.Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供 ...

  8. poj2405---体积几何

    #include <stdio.h> #include <stdlib.h> #include<math.h> #define pi acos(-1) int ma ...

  9. Putty以及adb网络调试

    1.什么是SSH? SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议. 传 ...

  10. SQlSERVER生成唯一编号

    基数表-用来存储编号前缀和类型 建表如下 CREATE TABLE [dbo].[SerialNo]( [sCode] [varchar](50) NOT NULL, [sName] [varchar ...