c语言sigaction,使用sigaction(),c[通俗易懂]

c语言sigaction,使用sigaction(),c[通俗易懂]让我们试着了解修改后的代码版本会发生什么:#include#includevoidtermination_handler(intsignum){printf(“Hellofromhandler\n”);sleep(1);}intmain(void){//Structsthatwilldescribetheoldactionandthenewaction//ass…

大家好,又见面了,我是你们的朋友全栈君。

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

#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,&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,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结构的详细说明.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141310.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • layui弹出层弹出另一个页面[通俗易懂]

    layui弹出层弹出另一个页面[通俗易懂]layer.open({type:2,skin:’layui-layer-demo’,//样式类名title:’标题’,closeBtn:0,//不显示关闭按钮anim:2,area:[‘893px’,’60…

    2022年6月14日
    225
  • 物联网架构_笔记_物联网总体架构

    物联网架构_笔记_物联网总体架构参考文章:http://www.elecfans.com/news/wangluo/20160517418825.htmlhttp://www.elecfans.com/iot/419545_a.html其中物联网的通信环境有Ethernet,Wi-Fi,RFID,NFC(近距离无线通信),Zigbee,6LoWPAN(IPV6低速无线版本),Bluetooth,GSM,G

    2022年9月16日
    2
  • 多尺度空间概念_人文地理学空间和尺度概念

    多尺度空间概念_人文地理学空间和尺度概念 1.图像的尺度这里图像的尺度并非指图像的大小,而是指图像的模糊程度,例如,人近距离看一个物体和远距离看一个物体模糊程度是不一样的,从近距离到远距离图像越来越模糊的过程,也是图像的尺度越来越大的过程。2.尺度空间的作用1.用机器视觉系统分析未知场景时,计算机并不预先知道图像中物体的尺度。我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。2.不同的尺度下都有…

    2022年10月14日
    3
  • 解决Mysql 的Access denied for user’root’@’localhost’ (using password: NO)问题

    解决Mysql 的Access denied for user’root’@’localhost’ (using password: NO)问题解决Win10下Mysql的Accessdeniedforuser’root’@’localhost’(usingpassword:YES)问题mysql一旦忘记密码即会出现这样的错误。解决步骤如下(注意cmd命令窗口必须以管理员身份打开)mysql一旦忘记密码即会出现这样的错误。解决步骤如下(注意cmd命令窗口必须以管理员身份打开)停掉mysql服务netsto…

    2022年5月29日
    76
  • TerminateProcess结束进程

    #include#include#includeBOOLKillProcess(DWORDdwProcessId){  HANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);BOOLbKill=TerminateProcess(hProcess,0);if(bKil

    2022年4月7日
    58
  • CSS3选择器02—CSS3部分选择器

    该部分主要为CSS3新增的选择器接上一篇CSS(CSS3)选择器(1)一.通用兄弟选择器:24:E~F,匹配任何E元素之后的同级F元素。二.属性选择器:25:E[att^=val]

    2022年3月25日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号