Linux下利用signal函数处理ctrl+c等信号

news/2024/7/8 8:04:54

前言

    linux下能够通过信号机制来实现程序的软中断,是一个很实用的编程方法。

我们平时在程序执行的时候按下ctrl-c、ctrl-z或者kill一个进程的时候事实上都等效于向这个进程发送了一个特定信号,当进程捕获到信号后,进程会被中断并马上跳转到信号处理函数。

默认情况下一个程序对ctrl-c发出的信号(SIGINT)的处理方式是退出进程。所以当我们按下ctrl-c的时候就能够终止一个进程的执行。

signal函数

    可是有时候我们希望我们的程序在被信号终止之前运行一些特定的收尾流程。或者我们希望我们的程序在收到特定信号后可以运行我们自定义的中断操作。在linux下我们可以通过signal函数实现上述的功能。

    比如:在Linux以下写一个程序。假设程序中出现死循环的话,我们就应该在键盘上按Ctrl+C来终止我们的程序,那么我们也能够捕获这个信号,然后运行我们自己的信号处理程序,输出一些实用的信息来帮助我们调试程序,这也算是一种技巧吧。假设我们不去捕获这个信号的话。那么信号产生后就去运行OS的信号处理程序。信号和中断非常像。我们既能够使用OS的中断处理程序。也能够截获中断运行自己的中断处理程序。以下是一个多线程的样例:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

#define true 1

void * One(void * no) 
{
    while (true)
    {
    printf("NUAACS1\n");
    sleep(1);
    }
}

void * Two(void * no) 

{
    while (true)
    {
    printf("NUAACS2\n");
    sleep(1);
    }
}

void Stop(int signo) 
{
    printf("oops! stop!!!\n");
    _exit(0);
}

int main()
{
    int res;
    pthread_t A, B;

    signal(SIGINT, Stop); 
    res = pthread_create(&A, NULL, One, NULL);
    res = pthread_create(&B, NULL, Two, NULL);
    res = pthread_join(A, NULL);
    res = pthread_join(B, NULL);

    return 0;
}


    以上是网上的资料,但另一点要注意的是,程序被中断并运行完中断函数后,也就是在中断函数中返回。那么程序会又一次返回到中断前的位置继续运行之前的程序。信号处理函数仅仅能返回void,不能返回指定的參数。

    另外,对于有些函数。程序的中断可能会打断这些函数的正常运行。比方说对于sleep函数,假设一个程序再sleep的途中被中断那么该程序会立马结束sleep。

转载于:https://www.cnblogs.com/brucemengbm/p/7355864.html


http://www.niftyadmin.cn/n/3122534.html

相关文章

win10开始菜单添加磁贴_Win10 开始菜单全新设计再曝光,磁贴图标出现彩虹选中效果...

自从Windows 10发布以来&#xff0c;就已经有不计其数的设计师或者是开发爱好者针对于Win 10进行了许多字形的设计以及改进&#xff0c;尤其是在外观设计UI上。而在此之前的2017开发者大会上&#xff0c;微软也是推出了一套全新的设计语言系统&#xff0c;也就是Fluent Design …

Codeforces Round #401 (Div. 1) C(set+树状数组)

题意&#xff1a; 给出一个序列&#xff0c;给出一个k&#xff0c;要求给出一个划分方案&#xff0c;使得连续区间内不同的数不超过k个&#xff0c;问划分的最少区间个数&#xff0c;输出时将k1~n的答案都输出 比赛的时候想的有点偏&#xff0c;然后写了个nlog^2n的做法&#x…

JSP是什么?

JSP是什么&#xff1f;sun公司制定的一种服务器端动态页面技术规范。JSP其实是一个以“jsp”为后缀的文件&#xff0c;该文件的内容主要是html和少量的java代码&#xff0c;容器会将jsp文件自动转换成一个servlet然后执行。如何写一个JSP文件&#xff1f;step1,创建一个以“.js…

python数据科学手册pdf微盘_适合新手的Python数据科学

对于做数据工作的新手&#xff0c;学习和使用一门编程语言&#xff0c;是基本的要求。你可以根据自己的实际情况&#xff0c;选择适合自己的编程语言。做数据工作的朋友&#xff0c;有的使用R语言(我的很多数据工作就是用R语言完成)&#xff0c;有的使用Python语言(我也是用Pyt…

Java To CSharp源代码转换

前言 开发环境 客户端&#xff1a;Unity3D开发(C#) 服务器&#xff1a;Java &#xff08;基于Java7&#xff09; 日 期&#xff1a;2016年09月 需求说明 部分服务器的部分逻辑功能在客户端实现一遍&#xff0c;可以简单的理解为服务器的部分逻辑代码搬到客户端来实现一遍。 想…

java的ArrayList(线性表)和LinkedList(双向链表)的深入学习

java的ArrayList和LinkedList的实现原理是完全不一样的&#xff0c;一个是用数组&#xff0c;而另一个则是用节点(Node)。 我们经常说&#xff0c;如果查询多&#xff0c;那就用ArrayList&#xff0c;而如果删除或者添加&#xff0c;那就用LinkedList。为什么要这样子&#xff…

完全数java

完全数&#xff1a;小于本身的所有因子的和&#xff08;包括1&#xff09; public class test01 {public static void main(String[] args) {Scanner scannernew Scanner(System.in);int nscanner.nextInt();for (int i2;i<n;i){int sum0;for (int j1;j<i;j)if (i%j0) su…

[Hihocoder] 字符串排序

题目 http://hihocoder.com/problemset/problem/1712 题解 https://www.zybuluo.com/wsndy-xx/note/1135606转载于:https://www.cnblogs.com/shandongs1/p/8992290.html