Linux中信号机制

信号机制

信号的概念

  • 概念:信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式
    所有信号的产生及处理全部都是由内核完成的
  • 信号的产生:
    1 按键产生
    2 系统调用函数产生(比如raise, kill)
    3 硬件异常
    4 命令行产生 (kill)
    5 软件条件(比如被0除,访问非法内存等)
  • 信号处理方式:
    1 缺省方式:默认的行为来做
    2 忽略信号:按照自己原本的行为去做
    3 捕捉信号:捕捉到信号后,不按照信号的指示,而是改变行为
  • 常用信号:
    信号名 含义 默认操作
    SIGHUP 该信号在用户终端关闭时产生,通常是发给和该
    终端关联的会话内的所有进程 终止
    SIGINT 该信号在用户键入INTR字符(Ctrl-C)时产生,内
    核发送此信号送到当前终端的所有前台进程 终止
    SIGQUIT 该信号和SIGINT类似,但由QUIT字符(通常是
    Ctrl-)来产生 终止
    SIGILL 该信号在一个进程企图执行一条非法指令时产生 终止
    SIGSEV 该信号在非法访问内存时产生,如野指针、缓
    冲区溢出 终止
    SIGPIPE 当进程往一个没有读端的管道中写入时产生,代
    表“管道断裂” 终止
    信号名 含义 默认操作
    SIGKILL 该信号用来结束进程,并且不能被捕捉和忽略 终止(例如:kill -9 pid)
    SIGSTOP 该信号用于暂停进程,并且不能被捕捉和忽略 暂停进程
    SIGTSTP 该信号用于暂停进程,用户可键入SUSP字符(
    通常是Ctrl-Z)发出这个信号 暂停进程
    SIGCONT 该信号让进程进入运行态 继续运行
    SIGALRM 该信号用于通知进程定时器时间已到 终止
    SIGUSR1/2 该信号保留给用户程序使用 终止
    SIGCHLD 是子进程状态改变发给父进程的。 忽略
  • 信号相关命令
    kill [-signal] pid
    killall [-u user | prog]

信号发送和定时器

  • 信号的函数:
    int kill(pid_t pid, int signum)
    功能:发送信号
    参数:
    pid: > 0:发送信号给指定进程
    = 0:发送信号给跟调用kill函数的那个进程处于同一进程组的进程。
    < -1: 取绝对值,发送信号给该绝对值所对应的进程组的所有组员。
    = -1:发送信号给,有权限发送的所有进程。
    signum:待发送的信号
    int raise(int sig);
    给自己发信号,等价于kill(getpid(), signo);
  • 信号相关函数-alarm/pause
    unsigned int alarm(unsigned int seconds);
    功能:定时发送SIGALRM给当前进程
    参数: seconds:定时秒数
    返回值:上次定时剩余时间。
    int pause(void)
    进程一直被阻塞,直到被信号中断
    被信号中断后返回-1,errno为EINTR
  • ualarm函数(循环发送)
    useconds_t ualarm(useconds_t usecs, useconds_t interval);
    以useconds为单位,第一个参数为第一次产生时间,第二个参数为间隔产生
    int setitimer(int which, const struct itimerval *new_value, struct itimerval old_value);
    功能:定时的发送alarm信号
    参数:
    which:
    ITIMER_REAL:以逝去时间递减。发送SIGALRM信号
    ITIMER_VIRTUAL: 计算进程(用户模式)执行的时间。 发送SIGVTALRM信号
    ITIMER_PROF: 进程在用户模式(即程序执行时)和核心模式(即进程调度用时)均计算时间。 发送SIGPROF信号
    new_value: 负责设定 timout 时间
    old_value: 存放旧的timeout值,一般指定为NULL
    struct itimerval {
    struct timeval it_interval; // 闹钟触发周期
    struct timeval it_value; // 闹钟触发时间
    };
    struct timeval {
    time_t tv_sec; /
    seconds /
    suseconds_t tv_usec; /
    microseconds */
    };
  • 信号的捕捉
    在这里插入图片描述
  • 信号捕捉过程:
  1. 定义新的信号的执行函数handle。
  2. 使用signal/sigaction 函数,把自定义的handle和指定的信号相关联。
  • signal函数:
    typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);
    功能:捕捉信号执行自定义函数
    返回值:成功时返回原先的信号处理函数,失败时返回SIG_ERR
    参数:
    signo 要设置的信号类型
    handler 指定的信号处理函数: SIG_DFL代表缺省方式; SIG_IGN 代表忽略信号;
    系统建议使用sigaction函数,因为signal在不同类unix系统的行为不完全一样。
  • 函数如下:
    在这里插入图片描述
  • 上述代码就是把ctrl + c的信号变为自定义的信号函数,就是执行自己设定的handle函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s ingress-nginx根据请求目录不同将请求转发到不同应用

K8s ingress-nginx根据请求目录不同将请求转发到不同应用 1. 起因 有小伙伴做实验想要实现以下需求: 输入www.pana.com/app1访问app1的svc 输入www.pana.com/app2访问app2的svc 2. 实验 2.1 Dockerfile 先准备Dockerfile FROM nginx:1.20ADD index.html /usr/share/ngin…

使用fgetc和fputc完成两个文件的拷贝

#include<myhead.h>int main(int argc, const char *argv[]) {//判断是否进行了外部传参if(argc!3){printf("input file error\n");printf("usage:./a.out srcfile destfile\n");return -1;}//定义文件指针&#xff0c;以只读的形式打开FILE *srcfpN…

ChatGPT如何提供实用且高质量的建议和指导,提高编程效率和准确性

ChatGPT4.0的功能包括&#xff1a; 无限制ChatGPT模型使用 GPT-4模型使用 GPT-4图像分析功能 GPT-4联网功能 GPT-4高级数据分析功能 GPT-4高级插件功能 DALLE-3高级AI绘图功能 如何能高效地处理文本、文献查阅、PPT编辑、编程、绘图和论文写作已经成为您成功的关键。而 …

Mac清理系统垃圾软件CleanMyMac X2025免费版本下载

嘿&#xff0c;Mac用户们&#xff0c;你是否经常感觉你的Mac就像是在背着一个沉重的包袱在跑步&#xff1f;是的&#xff0c;我在说那些堆积如山的系统垃圾。清理这些垃圾不仅可以让你的Mac跑得更快&#xff0c;还能让它“呼吸”更畅快。今天&#xff0c;让我们一起来探索如何M…

C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示

上一篇&#xff1a; C#&#xff0c;入门教程(04)——Visual Studio 2022 数据编程实例&#xff1a;随机数与组合https://blog.csdn.net/beijinghorn/article/details/123533838 新来的徒弟们交上来的C#代码&#xff0c;可读性往往很差。 今天一问才知道&#xff0c;他们居然不…

centos中安装go

安装过程 &#xff08;1&#xff09;源码二进制下载地址 wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz &#xff08;2&#xff09;将下载的二进制包解压至 /usr/local目录。 tar -C /usr/local/ -xzf go1.13.5.src.tar.gz &#xff08;3&#xff09;设置环…

ArcGIS model中分区统计迭代输出文件名

在模型中设置了迭代栅格数据&#xff0c;但输出过程中结果只能显示一个&#xff0c;因此采用提供的解析路径的方法提取出文件名字&#xff0c;不包含后缀名&#xff0c;作为前提条件输入到结果中。 1、首先选择工作空间&#xff0c;即存放ti影像的目录。 2、右键仅模型工具中选…

生产环境下,应用模式部署flink任务,通过hdfs提交

前言 通过通过yarn.provided.lib.dirs配置选项指定位置&#xff0c;将flink的依赖上传到hdfs文件管理系统 1. 实践 &#xff08;1&#xff09;生产集群为cdh集群&#xff0c;从cm上下载配置文件&#xff0c;设置环境 export HADOOP_CONF_DIR/home/conf/auth export HADOOP_CL…

vue实现自动滚动 v-auto-scroll

在项目中&#xff0c;有时候需要实现自动滚动的效果。这时我们直接使用 v-auto-scroll 即可。 也就是当内容超出设置元素的最大高度的时就会出现滚动条。

Kubernetes基础(二十二)-K8S的PV/PVC/StorageClass详解

1 概述 先来个一句话总结&#xff1a;PV、PVC是K8S用来做存储管理的资源对象&#xff0c;它们让存储资源的使用变得可控&#xff0c;从而保障系统的稳定性、可靠性。StorageClass则是为了减少人工的工作量而去自动化创建PV的组件。所有Pod使用存储只有一个原则&#xff1a;先规…

Go应用性能分析实战

Go很适合用来开发高性能网络应用&#xff0c;但仍然需要借助有效的工具进行性能分析&#xff0c;优化代码逻辑。本文介绍了如何通过go test benchmark和pprof进行性能分析&#xff0c;从而实现最优的代码效能。原文: Profiling Go Applications in the Right Way with Examples…

2024年2月的TIOBE指数,go语言排名第8,JAVA趋势下降

二月头条&#xff1a;go语言进入前十 本月&#xff0c;go在TIOBE指数前10名中排名第8。这是go有史以来的最高位置。当谷歌于2009年11月推出Go时&#xff0c;它一炮而红。在那些日子里&#xff0c;谷歌所做的一切都是神奇的。在Go出现的几年前&#xff0c;谷歌发布了GMail、谷歌…