2 等待一个全局变量被设置

这种情况是等待一个信号处理程序设置一个全局变量。下面的例子用于捕捉中断信号和退出信号,但是希望仅当退出信号处理程序时,才唤醒主进程。

#include

#include

#include

volatile sig_atomic_t quitflag;

/*

当把声明为该类型会保证该变量在使用或赋值时, 无论是在32位还是64位的机器上都能保证操作是原子的, 它会根据机器的类型自动适应。这个类型是定义在signal.h文件中。*/

static void sig_int(int signo)

{

if(signo == SIGINT)

printf("\ninterrupt\n");

else if(signo == SIGQUIT)

quitflag = 1;//等待这个全局变量

}

int main(void)

{

sigset_t newmask, oldmask, zeromask;

if(signal(SIGINT, sig_int) == SIG_ERR)

{

printf("signal(SIGINT) error");

exit(1);

}

if(signal(SIGQUIT, sig_int) == SIG_ERR)

{

printf("signal(SIGQUIT) error");

exit(1);

}

sigemptyset(&zeromask);

sigemptyset(&newmask);

sigaddset(&newmask, SIGQUIT);

if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//屏蔽SIGQUIT信号

{

printf("SIG_BLOCK error");

exit(1);

}

while(quitflag == 0)

{

sigsuspend(&zeromask);//sigsuspend解开所有屏蔽信号,然后等待quitflag变成1,然后才往下执行,否则在这里循环

printf("quitflag = %d\n", quitflag);

}

quitflag = 0;

if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)

{

printf("SIG_SETMASK error");

exit(1);

}

exit(0);

}

由显示结果可以看出,sigsuspend放开屏蔽信号,按下“ctrl+C”,进入中断,但是不设置quitflag,直到按下“ctrl+\”,quitflag置1,才往下执行。

在单进程程序当中,主进程和中断共享变量,这不失为一种好办法。

3 父子进程通信,关于这个只有几个函数。在此不做记录。

另外重点说下sigaction函数:

int sigaction(int signo, const struct sigaction *restrict act, struct *restrictoact);

这个函数用来修改或者检查与指定信号相关联的处理动作,其中,参数signo是要检测或者修改其具体动作的信号编号,若act指针非空,

则要修改其动作,若oact非空,则系统由oact指针返回该信号的上一个动作。其中的结构体如下:

struct sigaction{

void (*sa_handler)(int);

sigset_t sa_mask;

int sa_flag;

void (*sa_sigaction)(int, siginfo_t *, void *);

};

关于这个函数可以这样理解:如果sa_handler字段有效,即这个字段是一个有效信号捕捉地址,则sa_mask字段信号集是这样的

在调用该捕捉函数前,这一信号集要加到进程的信号屏蔽字中,仅当从信号捕捉函数返回时再将进程的信号屏蔽字恢复到原来状态

这样,在信号处理函数调用时,就能阻塞某些信号,即在执行信号处理程序时,系统新建立的信号能被屏蔽,保证了在信号处理过程当中,

如果同一种信号再次发生,那么它会被阻塞到前一个新红处理完毕。例如:

int main(void)

{

int i = 0;

structsigactionact, oldact;

act.sa_handler = show_handler;

...

sigaddset(&act.sa_mask, SIGQUIT);

....

sigaction(SIGINT, &act, &oldact);

while(1) {

sleep(1);

printf("sleeping %d\n", i);

i++;

}}

上面函数设置SIGINT捕捉函数,在从SIGINT信号处理函数返回以前,把SIGQUIT信号屏蔽,从信号处理函数返回以后,恢复原来的信号屏蔽字。

这样即使在信号处理过程当中产生SIGQUIT信号,在接触屏蔽以后,信号SIGQUIT也能递达而不丢失。

linux中信号的处理,linux中关于信号处理笔记(二)相关推荐

  1. html 对p中一段话指定样式,HTML5学习笔记(二)

    一.常用标签 1.< p> 标签:段落标签,用来显示一段文本 段落文本 2.< h> 标签:从 h1-h6字体越来越大.标题标签. 一级标题 二级标题 三级标题 四级标题 五级 ...

  2. linux 系统对信号的处理,Linux下的信号处理函数总结

    1.信号处理函数 相关函数原型如下: #include sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处 ...

  3. linux 屏蔽信号 sig_kill sig_stop,linux 信号处理

    曾做过signal相关的一点儿开发,谈谈我的一些理解. 首先,需要理解几个signal相关的函数. sigaddset(sigset_t* sigSet, int sigNum ) :  将信号sig ...

  4. Linux 进程信号

    目录 什么是信号 生活中的角度 技术中的角度 PS 信号概念 kiil -l 查看所有信号 对于信号的分析 关于信号的产生(信号产生前) 1. 通过终端按键产生信号 2. 调用系统函数向进程发信号 3 ...

  5. linux进程中对信号的屏蔽,linux进程中的信号屏蔽

    在linux的进程中可以接收到各种的信号,并且如果你不对信号进行处理,linux中的进程就会采用默认的处理方式处理,比如ctrl-c的信号,进程对它的处理就是终止进程的执行. 在linux中,我们也可 ...

  6. linux用信号写代码,Python 信号(linux) 源代码放附件中

    Python信号 果汁味 信号的概念 信号(signal)--进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT终止进程中断 ...

  7. 【关于Linux中----信号】

    文章目录 一.信号入门 1.1 信号概念 1.2 用 kill-l命令查看信号列表 1.3 信号处理常见方式预览 二.产生信号 2.1 通过终端按键产生信号 2.2 由于程序中存在异常产生信号 2.3 ...

  8. linux通过信号回调函数,信号机制的管理结构 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...

    信号只是一个数字,数字为0-31表示不同的信号,如下表所示. 编号 信号名 默认动作 说明 1 SIGHUP 进程终止 终端断开连接 2 SIGINT 进程终止 用户在键盘上按下CTRL+C 3 SI ...

  9. 在linux系统中 下列哪些信号无法捕获,下列哪个选项不是 Linux 系统中信号的状态。...

    下列哪个选项不是 Linux 系统中信号的状态. 更多相关问题 通 过 和他人的 谈话 . 观 察 市场 情况 等也 可以 获得 大量 的信 息 , 特 别 是 通过 人们 在日常生活 中 的 抱 怨 ...

最新文章

  1. JS组件系列——BootstrapTable 行内编辑解决方案:x-editable
  2. TestNG测试框架之失败测试重跑
  3. 网络编程中的锁与队列
  4. [APIO2010]
  5. 网页制作中的背景处理
  6. 英语语法---形容词短语详解
  7. .NET中的Assembly分析
  8. 人人都喜欢用的十大python标准库
  9. vue 自定义打印CLodop
  10. wps演示怎么提高列表级别_wps文字如何设置标题级别?wps设置标题级别教程
  11. 解决方案:Win C++ mingw编译器出现 不支持的16位程序问题
  12. 免费服务器推荐1:无限自由
  13. 我的世界python——方块朋友(方块设置移动路径getline)
  14. java constants_Java Constants类代码示例
  15. Hexo Icarus配置和美化升级
  16. win7连接远程桌面时出现黑屏的解决方法(亲测有效)——终于找到解决办法了
  17. hash函数原理实现
  18. gitBash快速清屏,git命令行操作,快速清屏,清屏
  19. 为什么很多硅谷工程师偏爱 OS X,而不是 Linux 或 Windows
  20. 51单片机与蜂鸣器实现摩斯密码转换。

热门文章

  1. 【转】Linux入门命令篇(简训)
  2. Android环境下通过C框架层控制WIFI【转】
  3. Team Task:DP
  4. 微信小程序开发遇到的那些“坑”(1.2.0-1.4.0)
  5. JS替换空格回车换行符
  6. 《Excel 职场手册:260招菜鸟变达人》一第 20 招 怎样在单元格文字前加空白
  7. 数据库分页存储过程(4)
  8. laravel 目录
  9. 使用Poco实现插件方式加载动态库
  10. twiiq开发随笔(2)