【Linux系统编程】26.信号、kill、alarm、setitimer

这篇具有很好参考价值的文章主要介绍了【Linux系统编程】26.信号、kill、alarm、setitimer。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

信号

信号共性

信号特质

产生信号

信号相关概念

默认处理动作

信号4要素

常规信号  ​编辑

注意

kill

参数pid

测试代码1

测试结果

测试代码2

测试结果

alarm

参数seconds

返回值

取消闹钟

测试代码3

测试结果1

测试结果2  ​编辑

setitimer

参数which

参数new_value

参数old_value

测试代码4

测试结果

信号集操作函数

信号

信号共性

  • 简单

  • 不能携带大量信息

  • 满足条件才能发送

信号特质

       信号是软件层面上的“中断”,一旦信号产生,无论程序执行到什么位置,都必须立即停止运行,处理信号,处理完成后,再继续执行后续程序。所有信号的产生及处理都是由内核完成。

产生信号

  1. 按键产生

  2. 系统调用产生

  3. 软件条件产生

  4. 硬件异常产生

  5. 命令产生

信号相关概念

未决:产生与递达之间的状态。

递达:产生并且送达到进程,直接被内核处理掉。

信号处理方式

  1. 执行默认处理动作。

  2. 忽略。

  3. 捕捉。

阻塞信号集(信号屏蔽字):本质是位图。用来记录信号的屏蔽状态。一旦被屏蔽的信号,在解除屏蔽之前,一直处于未决态。

未决信号集:本质是位图。用来记录信号的处理状态。该信号集中的信号表示已经产生,但未被处理。

默认处理动作

Term:终止进程。

lgn:忽略信号。

Core:终止进程,生成Core文件。可以查验进程死亡原因,用gdb进行调试。

Stop:停止进程或暂停进程。

Cont:继续运行进程。

信号4要素

信号使用之前,必须先确定其4要素,再进行使用。

  1. 信号编号

  2. 信号名称

  3. 信号对应时间

  4. 信号默认处理动作

man 7 signal

【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++

       在标准信号中,有一些信号是有三个“Value”,第一个值通常对alpha和sparc架构有效,中间值针对x86、arm和其他架构,最后一个应用于mips架构。一个‘-’表示在对应架构上尚未定义该信号。

       不同的操作系统定义了不同的系统信号。因此有些信号出现在Unix系统内,也出现在Linux 中,而有的信号出现在FreeBSD或Mac OS中却没有出现在Linux下。

常规信号  

  1. SIGHUP:当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作为终止进程。

  2. SIGIN:当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。

  3. SIGQUIT:当用户按下<ctrl+\>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信号。默认动作为终止进程。

  4. SIGILL:CPU检测到某进程执行了非法指令。默认动作为终止进程并产生core文件。

  5. SIGTRAP:该信号由断点指令或其他trap指令产生。默认动作为终止进程并产生core文件。

  6. SIGABRT:调用abort函数时产生该信号。默认动作为终止进程并产生core文件。

  7. SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件。

  8. SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。 默认动作为终止进程并产生core文件。

  9. SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可以杀死任何进程的方法。

  10. SIGUSE1:用户定义的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。

  11. SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生core文件。

  12. SIGUSR2:另外一个用户自定义信号,程序员可以在程序中定义并使用该信号。默认动作为终止进程。

  13. SIGPIPE:Broken pipe向一个没有读端的管道写数据。默认动作为终止进程。

  14. SIGALRM:定时器超时,超时的时间由系统调用alarm设置。默认动作为终止进程。

  15. SIGTERM:程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行 shell命令Kill时,缺省产生这个信号。默认动作为终止进程。

  16. SIGSTKFLT:Linux早期版本出现的信号,现仍保留向后兼容。默认动作为终止进程。

  17. SIGCHLD:子进程状态发生变化时,父进程会收到这个信号。默认动作为忽略这个信号。

  18. SIGCONT:如果进程已停止,则使其继续运行。默认动作为继续/忽略。

  19. SIGSTOP:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为暂停进程。

  20. SIGTSTP:停止终端交互进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程。

  21. SIGTTIN:后台进程读终端控制台。默认动作为暂停进程。

  22. SIGTTOU:该信号类似于SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。

  23. SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据到达,默认动作为忽略该信号。

  24. SIGXCPU:进程执行时间超过了分配给该进程的CPU时间 ,系统产生该信号并发送给该进程。默认动作为终止进程。

  25. SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。

  26. SIGVTALRM:虚拟时钟超时时产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。默认动作为终止进程。

  27. SGIPROF:类似于SIGVTALRM,它不公包括该进程占用CPU时间还包括执行系统调用时间。默认动作为终止进程。

  28. SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号。

  29. SIGIO:此信号向进程指示发出了一个异步IO事件。默认动作为忽略。

  30. SIGPWR:关机。默认动作为终止进程。

  31. SIGSYS:无效的系统调用。默认动作为终止进程并产生core文件。

34~64. LINUX 的实时信号,它们没有固定的含义,可以由用户自定义。所有的实时信号的默认动作都为终止进程。

注意

       9) SIGKILL和19) SIGSTOP信号,不允许忽略和捕捉,只能执行默认动作。甚至不能将其设置为阻塞。

        只有每个信号所对应的事件发生了,该信号才会被递送,但不一定递达,不应乱发信号!

kill

man 2 kill

【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++

参数pid

大于0:发送信号给指定进程。

等于0:发送信号给跟调用kill函数的那个进程处于同一进程组的进程。

小于-1:取绝对值,发送信号给该绝对值所对应的进程组的所有进程。

等于-1:发送信号给有权限发送的所有进程,普通用户基本规则是,发送者实际或有效用户ID==接收者实际或有效用户ID。

测试代码1

用子进程杀了父进程。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>

int main(int argc, char *argv[])
{
    pid_t JinCheng_ID;
    JinCheng_ID = fork();
    if (JinCheng_ID > 0) //父进程
    {
        printf("这是父进程,该进程ID是%d。开始进入死循环。\n", getpid());
        while (1)
        {
            printf("这是父进程,已在死循环。\n");
            sleep(1);
        }
    }
    else if (JinCheng_ID == 0) //子进程
    {
        printf("这是子进程,该进程ID是%d。先睡一会再杀父进程。\n", getpid());
        sleep(3);
        printf("这是子进程,该进程ID是%d。睡醒了,我杀。\n", getpid());
        kill(getppid(),SIGKILL);
        printf("这是子进程,该进程ID是%d。杀完了,拜拜。\n", getpid());
    }
    return 0;
}

测试结果

 【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++

测试代码2

杀进程组

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>

int main(int argc, char *argv[])
{
    pid_t JinCheng_ID;
    JinCheng_ID = fork();
    if (JinCheng_ID > 0) //父进程
    {
        printf("这是父进程,该进程ID是%d。开始进入死循环。\n", getpid());
        while (1)
        {
            printf("这是父进程,已在死循环。\n");
            sleep(1);
        }
    }
    else if (JinCheng_ID == 0) //子进程
    {
        printf("这是子进程,该进程ID是%d。先睡一会再杀进程组。\n", getpid());
        sleep(3);
        printf("这是子进程,该进程ID是%d。睡醒了,我杀。\n", getpid());
        kill(0, SIGKILL);
        printf("这是子进程,该进程ID是%d。杀完了,拜拜。\n", getpid());
    }
    return 0;
}

测试结果

进程组被杀后,子进程最后的输出不再进行输出。

 【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++

alarm

定时发送SIGALRM给当前进程。

实际时间=用户时间+内核时间+等待时间,代码优化,优先从IO下手。

man 2 alarm

【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++

参数seconds

定时秒数。

返回值

上次剩余的时间。

取消闹钟

alarm(0);

测试代码3

查看程序1秒钟的计数次数。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int i = 0;
    alarm(1); //定时1秒
    while (1)
    {
        printf("%d\n", i++);
    }
    return 0;
}

测试结果1

【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++

测试结果2  【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++

setitimer

设置定时器(闹钟)。 可代替alarm函数。精度微秒us,可以实现周期定时。

man 2 setitimer

【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++

参数which

指定定时方式。

  • ITIMER_REAL:自然定时,计算自然时间,信号是14)SIGLARM。

  • ITIMER_VIRTUAL:虚拟空间计时(用户空间),只计算进程占用cpu的时间,信号是26)SIGVTALRM。

  • ITIMER_PROF:运行时计时(用户+内核),计算占用cpu及执行系统调用的时间,信号是27)SIGPROF。

参数new_value

定时秒数。

struct itimerval {
    struct timeval it_interval; //后续每个中断的间隔执行时间
    struct timeval it_value;    //第一次执行中断的时间
};

struct timeval {
    time_t      tv_sec;         //秒
    suseconds_t tv_usec;        //微秒
};
struct itimerval {
    struct timeval {	//后续每个中断的间隔执行时间
        time_t      tv_sec;         //秒
        suseconds_t tv_usec;        //微秒
    }it_interval;
    struct timeval {	//第一次执行中断的时间
        time_t      tv_sec;         //秒
        suseconds_t tv_usec;        //微秒
    }it_value;
};

参数old_value

传出参数,上次定时剩余的时间。

测试代码4

周期性输出内容。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>

void ChuLi_HanShu()
{
    printf("你好,世界!\n");
}

int main(int argc, char *argv[])
{
    int i = 0;
    struct itimerval new_value, old_value;
    signal(SIGALRM, ChuLi_HanShu); //注册SIGALRM信号的捕捉处理函数

    //2秒后开始第1次中断
    new_value.it_value.tv_sec=2;
    new_value.it_value.tv_usec=0;

    //每5秒来一次中断
    new_value.it_interval.tv_sec=5;
    new_value.it_interval.tv_usec=0;

    if(setitimer(ITIMER_REAL,&new_value,&old_value)==-1){
        perror("设置中断错误");
        exit(1);
    }

    while (1)
    {
        printf("%d秒\n", i++);
        sleep(1);
    }
    return 0;
}static

测试结果

【Linux系统编程】26.信号、kill、alarm、setitimer,Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++文章来源地址https://www.toymoban.com/news/detail-860692.html

信号集操作函数

sigset_t set;	//自定义信号集
sigemptyset(sigset_t *set);		//清空信号集
sigfillset(sigset_t *set);		//全部置1
sigaddset(sigset_t *set,int signum);	//每一个信号添加到集合中
sigdelset(sigset_t *set,int signum);	//将一个信号从集合中移除
sigismember(const sigset_t *set,int signum);	//判断一个信号是否在集合中。返回值:1:在;0:不在。

到了这里,关于【Linux系统编程】26.信号、kill、alarm、setitimer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux 信号原理 信号处理设置signal, 信号发送kill,信号等待sigsuspend,信号阻塞sigprocmask,一网打尽信号使用

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 个人主页 :我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. ================================ 信号是一种软中断的方式,让进程陷入中断处理调用中; linux 下信号也是一种进程间通信的手段;进

    2024年02月13日
    浏览(41)
  • Unix/Linux系统编程:信号驱动IO

    详细信息参考unix/linux系统编程手册第63章  在I/O多路复用中,进程是通过系统调用(select()或poll())来检查文件描述符上是否可以执行I/O操作。而在信号驱动I/O中,当文件描述符上可执行I/O操作时,进程请求内核为自己发送一个信号。之后进程就可以执行任何其他的任务直到

    2024年02月11日
    浏览(37)
  • 【Linux系统编程二十九】基于信号量的环形队列生产消费模型

    当共享资源被当成整体使用时,则共享资源的数量要么是1,要么是0。 当被访问使用时,共享资源的数量就为0,当没有被使用时,数量就为1。 共享资源是可以被分成多份来使用的,只不过不同的线程访问的是该共享资源的不同的区域,它是允许多个线程并发访问的,只不过

    2024年01月22日
    浏览(48)
  • Linux笔记--查看Linux系统自动Kill掉的进程

    目录 1--前言 2--查看系统日志 3--参考         今天在服务器训练一个模型,程序无任何错误,但一段时间后挂在后台的进程莫名被Kill掉,原因在于服务器 linux 系统的运行内存不足,为了避免系统奔溃,系统主动 kill 内存占用最大的进程。         通过查看系统日志,可以确

    2024年02月16日
    浏览(42)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第六天-Linux信号(物联技术666)

     更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客 物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单

    2024年01月19日
    浏览(57)
  • kill,alarm,raise,abort,pause,signal等函数的使用

    kill 函数是UNIX和类UNIX操作系统中的一个标准库函数,主要用于向指定进程发送信号。 pid_t pid  是进程ID, int signum   是信号的编号。 kill 函数的作用是将 signum 指定的信号发送到 pid 指定的进程 。 pid 0 :将信号发送给进程ID为 pid 的进程。 pid = 0 :将信号发送给当前进程所在

    2024年04月23日
    浏览(32)
  • 关于 RK3568的linux系统killed用户应用进程(用户现象为崩溃) 的解决方法

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/132710642 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…   RK3568运行播放7路rtsp播放,时

    2024年02月09日
    浏览(63)
  • 【探索Linux】—— 强大的命令行工具 P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )

    本文将深入探讨使用套接字进行网络通信的基本步骤,包括创建套接字、绑定地址、监听连接(对于服务器端)、连接远程主机(对于客户端)、以及发送和接收数据等操作。套接字编程涉及一系列系统调用和函数,如 socket() 、 bind() 、 listen() 、 connect() 、 send() 、 recv() 等。

    2024年03月10日
    浏览(84)
  • 【Orangepi Zero2 全志H616】驱动舵机控制 / Linux定时器(signal、setitimer)

    一、SG90舵机开发 舵机基本介绍 二、Linux定时器 signal 函数 setitimer 函数原型 signal、setitimer函数API调用 三、舵机 软件PWM实现 如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制用处: 垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等

    2024年02月05日
    浏览(52)
  • 【Linux C | 多线程编程】线程同步 | 信号量(无名信号量) 及其使用例子

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍 🍭 😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭 ⏰发布时间⏰: 本文未经允许,不得转发!!!

    2024年04月26日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包