让我们试着了解修改后的代码版本会发生什么:

#include

#include

void termination_handler(int signum)

{

printf("Hello from handler\n");

sleep(1);

}

int main (void)

{

//Structs that will describe the old action and the new action

//associated to the SIGINT signal (Ctrl+c from keyboard).

struct sigaction new_action, old_action;

//Set the handler in the new_action struct

new_action.sa_handler = termination_handler;

//Set to empty the sa_mask. It means that no signal is blocked

// while the handler run.

sigemptyset(&new_action.sa_mask);

//Block the SEGTERM signal.

// It means that while the handler run, the SIGTERM signal is ignored

sigaddset(&new_action.sa_mask, SIGTERM);

//Remove any flag from sa_flag. See documentation for flags allowed

new_action.sa_flags = 0;

//Read the old signal associated to SIGINT (keyboard, see signal(7))

sigaction(SIGINT, NULL, &old_action);

//If the old handler wasn't SIG_IGN (it's a handler that just

// "ignore" the signal)

if (old_action.sa_handler != SIG_IGN)

{

//Replace the signal handler of SIGINT with the one described by new_action

sigaction(SIGINT,&new_action,NULL);

}

while(1)

{

printf("In the loop\n");

sleep(100);

}

return 0;

}

因此,如果您编译并启动它,然后按Ctrl C,那么您将执行处理程序消息,然后您立即返回主要的睡眠状态.您可以根据需要多次执行此操作,并且仍会显示处理程序消息和内联消息.

因此,您提供了一个函数,sigaction会执行将信号与处理程序挂钩所需的所有操作.

现在,sigterm怎么样?如果你在termination_handler中增加了睡眠时间,你可以在按下Ctrl C后键入类似“pkill –signal SIGTERM ./a.out”的内容.然后,会发生什么?没有!在termination_handler运行时,SIGTERM信号被阻止.但是一旦你回到主,现在SIGTERM将杀死应用程序.

(请记住,在测试此代码时,您仍然可以通过发送SIGKILL信号来终止应用程序.)

如果你想了解更多,并且对信号有更多的乐趣,你可以使用signal manual和sigaction manual来说明更多信息.请注意,您还具有sigaction结构的详细说明.

c语言sigaction,使用sigaction(),c相关推荐

  1. linux c 自定义 sigaction,Linux sigaction信号机制积累

    1.Linxu下使用signal()函数获取信号: signal()函数: #include typedef void (*sighandler_t)(int); sighandler_t signa ...

  2. linux下sigaction函数,sigaction函数解析

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该 ...

  3. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  4. linux操作系统信号捕捉函数之sigaction用法小结

    (1)sigaction函数:注册一个信号捕捉函数(不参与捕捉信号,信号由内核捕捉),并修改原来的信号处理动作 (2)函数原型及头文件 头文件:#include<signal.h> 函数原 ...

  5. 信号发送函数sigqueue和信号安装函数sigaction

    一,sigaction() #include <signal.h>  int sigaction(int signum,const struct sigaction *act,struct ...

  6. 嵌入式Linux系统编程学习之十五sigaction信号处理机制

    文章目录 一.信号处理情况分析 二.sigaction 信号处理注册 三.sigprocmask 信号阻塞 一.信号处理情况分析   在 signal 处理机制下,还有许多特殊情况需要考虑: 注册一个 ...

  7. sigaction介绍

    sigaction 原型: int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restri ...

  8. 信号的捕捉与sigaction函数

    一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SI ...

  9. Linux signal、sigaction的使用总结

    目录 一.什么是信号 二.信号的种类 三.信号的处理 -- signal()函数 四.信号处理 -- sigaction()函数(扑获信号) 五.扑获信号示例 一.什么是信号 信号是UNIX和Linu ...

最新文章

  1. win10安装jdk1.8
  2. Noip2012同余方程
  3. 浅谈Socket编程
  4. 试图执行系统不支持的操作
  5. Linux C: 文件操作相关的系统调用
  6. spring的注解开发@Component @Bean @Value @Autowired、@Qualifier @PropertySource @Configuration
  7. 在JBoss 7中使用HA Singleton
  8. Python 装饰器详解(中)
  9. js去掉html标签和去掉字符串文本的所有的空格
  10. pythonfor循环遍历字典的属性_python-嵌套和for循环中的字典和列表中的项...
  11. python argparse 简明教程
  12. Memset、Memcpy、Strcpy 的作用和区别(转)
  13. 关于Ubuntu的联网操作
  14. 关于货币流动的一点思考
  15. C++ 程序设计 week5 魔兽世界二: 装备
  16. 成成你好呀(C知识点整理二)
  17. yum不能使用了,怎么办?记下来!!!
  18. BZOJ[3620]似乎在梦中见过的样子 KMP
  19. 《作业疯了》超奇葩游戏挑战你的脑细胞
  20. Linux系统文件体系

热门文章

  1. viewport是什么?(江湖称响应式web设计)
  2. Hadoop企业优化
  3. Java程序设计----Java编程基础
  4. leetcode 453,462. Minimum Moves to Equal Array Elements I, II | 453, 462. 最少移动次数使数组元素相等(图解)
  5. 【Servlet】HTTP 协议之请求方式、Servlet介绍、Servlet 的生命周期
  6. 【Java反射】反射机制性能问题、反射操作泛型
  7. 【JavaWeb】Response请求转发与重定向辨析
  8. java高级用法之:调用本地方法的利器JNA
  9. Leet Code OJ 26. Remove Duplicates from Sorted Array [Difficulty: Easy]
  10. 操作系统中的同步和异步