Linux c 信号—pause、sigsuspend 的相同于区别
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 的相同于区别的更多相关文章
- Linux C 信号 pause、sigsuspend 的相同与区别
pause函数: 功能:让进程暂停直到信号出现 #include<unistd.h> intpause(); 函数说明:pause()会令目前的进程暂停(进 ...
- Linux 等待信号(sigsuspend)
/* sigsuspend()函数说明 */ #include <stdio.h> #include <signal.h> /* 知识补充: sigsuspend()函数 函数 ...
- Linux&C ——信号以及信号处理
linux信号的简单介绍 信号的捕捉和处理 信号处理函数的返回 信号的发送 信号的屏蔽 一:linux信号的简单介绍. 信号提供给我们一种异步处理事件的方法,由于进程之间彼此的地址空间是独立的,所以进 ...
- Linux&C ——信号以及信号处理
linux信号的简单介绍 信号的捕捉和处理 信号处理函数的返回 信号的发送 信号的屏蔽 一:linux信号的简单介绍. 信号提供给我们一种异步处理事件的方法,由于进程之间彼此的地址空间是独立的,所以进 ...
- Linux进程间通信——信号集函数
一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...
- linux kill信号列表
linux kill信号列表 $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) ...
- linux 自定义信号
从来没试过linux自定义信号,查了下,说是系统只提供了SIGUSR1和SIGUSR2两个,就两个够吗?更要命的是如果要自定义信号如#define SIG_MYSIG ....的话要改内核才行,哥 ...
- linux 异步信号的同步处理方式
关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略.本文首先介绍如何编写安全的异步信号处理函数:然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同 ...
- Linux 的信号和线程
什么是线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,每一个程序都至少 ...
随机推荐
- Twisted No module named win32api
安装twisted成功后,使用时抛错: No module named win32api 解决方案,需要安装 pywin32 下载地址: https://sourceforge.net/project ...
- Flink资料(2)-- 数据流容错机制
数据流容错机制 该文档翻译自Data Streaming Fault Tolerance,文档描述flink在流式数据流图上的容错机制. ------------------------------- ...
- 【转】MUD教程--巫师入门教程1
<新巫师入门手册> 第一章:观念篇■ 内容提要:什么是巫师?怎样做一个巫师?如何做好一个巫师? 第二章:上手篇■ 内容提要:最简单的房间怎么写?NPC又怎么写?先看懂一些常用的参数? 第三 ...
- Windows下bat命令
一.简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置. 语法 echo [{on│off}] [mess ...
- 括号匹配算法 C语言实现
#include <stdio.h> #include <malloc.h> //malloc,realloc #include <math.h> //含有over ...
- MYSQL 关闭服务的过程
服务器关闭进程可以概括为: 1. 启动关闭进程 2. 服务器根据需要创建关闭线程 3. 服务器停止接收新连接 4. 服务器终止当前的活动 5. 存储引擎被停掉或关闭 6. ...
- 优盘(U 盘) 采用TLC, MLC, SLC芯片 的区别 与使用寿命
最近一直在看大家在讨论sandisk,pny,金士顿等大厂都开始用tlc的芯片问题,让大家基本都不敢用U盘存数据了按照之前的擦写参数TLC 1000次MLC 10000次SL ...
- C语言入门(8)——形参与实参
对于带参数的函数,我们需要在函数定义中指明参数的个数和每个参数的类型,定义参数就像定义变量一样,需要为每个参数指明类型,并起一个符合标识符命名规则的名字.例如: #include <stdio. ...
- thenjs的应用
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JDBC增强
JDBC增强 批处理:批量处理sql语句,比如批量添加用户信息. addBatch() //pstmt.addBatch() 就是替换一条一条执行的execute****** executeBat ...