Linux下的信号(一)

2023-05-16

信号主要是用于不同进程之间进行通信的机制,进程之间的相互协作也正是通过发送信号来完成的,而信号的本质就是修改PCB中关于信号变量的某个比特位(至于为什么是一个比特位,随后就会做出解释)

 

查看当前系统定义的信号列表:kill -l

 

请看仔细咯,上面的信号量列表个数并不是64个,而是62个


信号分类


普通信号:1——31号信号

实时信号:34——64号信号

 

在我们的学习中主要研究的是1——31号普通信号,因此在对应的PCB中采用位图这个数据结构,就可以表示一个信号的存在与否,这也解释了上面的信号量本质为什么是修改PCB中管理信号的变量的一个比特位

 

背景知识

 

前台进程:基本上不和用户交互,优先级稍微低一些

后台进程:需要和用户进行交互,需要较高响应速度,优先级别稍微高一些

 

信号产生的条件

 

(1)用户在终端按下某些组合键,终端驱动程序会发送信号给前台信号;



(2)硬件异常产生信号,有硬件检测并发送给内核,然后由内核向当前进程发送信号;


进程终止的根本原因就是因为收到信号


(3)使用kill命令发送信号给其他进程;

 

信号的三种处理方式

 

(1)忽略此信号(大多数信号都可以使用这种方式处理)


特例:SIGKILL和SIGSTOP

原因:他们向超级用户提供一种使进程终止或停止的可靠方法,同时,如果忽略某些由硬件异常产生的信号,则进程的行为是未定义的。


(2)直接执行进程对于该信号的默认动作(与信号的种类有关,大多数会直接终止该进程)


(3)捕捉信号(执行自定义动作,使用signal函数,而要做到这一点必须调用handler用户函数,可以执行用户希望做的事情)


特例:不能捕捉SIGKILL和SIGSTOP函数

原因:试想一下,如果所有的信号都可以被捕捉,那么当非法用户入侵时就会导致进程永远杀不掉,因此系统在最初设计这些信号时,就特意留出了不能被捕捉的信号。

 

#include <signal.h>
 typedef void (*sighandler_t)(int);                    //具体执行动作的函数
sighandler_t signal(int signum, sighandler_t handler); //第一个参数,信号编号,第二个参数,信号执行的动作


代码示例:

 

#include<stdio.h>
#incldue<stdlib.h>
#include<signal.h>

void* mysig(int sig)
{
     printf("pid: %d,sig is %d\n",getpid(), sig);
}

int main()
{
     signal(2,mysig);
     retrurn 0;
}


查看当前的mysignal进程状态

 

 

利用core dump(核心转储)定位错误地方


error:error.c
        gcc -o error error.c
.PHONY:clean
clean:
        rm -f error

 

#include<stdio.h>

int main()
{
        int* p=10;
        *p=5;
        printf("%d",(int)p);
        return 0;
}

 

运行结果:



先试用ulimit -a来查看当前系统下各种资源的上限

 

 

系统默认的大小是0,而core dump的作用是,当一个进程正在运行,突然收到一场错误时,操作系统为了方便调试,将内存中的进程数据存储到硬盘中。但是以死循环的形式将错误不停的存储时,后果可想而知。

 

修改ulimit -c [size]修改core dump的大小

 

 

修改core文件之后,再次编译查看时,就会有一个很大的core文件产生(其后的数字表示进程号)

 

 

使用core-file core.xxxx定位错误

 


Linux下的信号(二)

http://blog.csdn.net/double_happiness/article/details/72897148

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下的信号(一) 的相关文章

  • 如何让 PHP、符号链接和 __FILE__ 很好地协同工作?

    在本地主机上 我有以下目录结构 share www trunk wp content plugins otherfolders share www portfolio wp content symlink Where symlink是一个符
  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • 使用 gatttool 或 bluepy BLE 订阅通知

    我正在使用 bluepy 编写一个程序 用于监听蓝牙设备发送的特征 我还可以使用任何库或语言 唯一的限制是在 Linux 上运行 而不是在移动环境中运行 似乎仅在移动设备中广泛使用 没有人在桌面上使用 BLE 使用 bluepy 我注册了委
  • 让“git pull”在拉取不同分支时要求确认

    当同时处理许多项目和分支时 我偶尔会犯一些愚蠢的错误 比如拉入错误的分支 例如在分支上master I did git pull origin dangerous code并且有一段时间没有注意到这一点 这个小错误造成了很大的混乱 当我尝试
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • 如何真正释放 Linux 中的大页面以供新进程使用?

    真的找不到太多关于此的信息 希望有人可以提供帮助 我正在假脱机使用 100GB java 堆作为大数据缓存 为了避免与文件系统缓存等内容发生冲突 并且因为它通常性能更好 我将其分配在大页面中 我保留了 51 200 x 2MB 大页面 一切
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • 如何从“git log”中查看 Git 中的特定版本?

    My git log显示为 enter code here git trial git log commit 4c5bc66ae50780cf8dcaf032da98422aea6e2cf7 Author king lt email pro
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插

随机推荐

  • Linux常用工具安装和vim设置的命令实现

    声明 xff1a 本文是针对centos6 0的版本进行安装和设置的 xff0c 在现在下载的Centos版本上基本上会自带一些基本的工具 xff0c 因此在安装之前需要先进行检查 xff0c 如果不存在 xff0c 在进行下载安装 gcc
  • C实现当前机器模式是大端还是小端

    声明 xff1a 本文是在32位机器 xff0c vs2013下运行无误 大小端背景 xff1a 大小端这一词最早是来自 格列夫游记 xff0c 书中记录有一个村子 xff0c 村子里的人有一个强烈的争议 xff0c 关于吃鸡蛋的时候应该从
  • C模拟实现点分十进制IP转换

    声明 xff1a 本文在32位机器上测试无误 点分十进制 点分十进制是计算机网络中的一个名词 xff0c 是一种网络地址的表示方法 xff0c 每一组数字都是在0 255之间 xff0c 每个组之间都是通过 34 34 来进行分割的 xff
  • C面试常考知识点详解

    小结清单 xff1a 指针与引用区别与联系 指针与数组的区别与联系 结构体内存对齐 指针与引用区别与联系 联系 xff1a 底层实现方式相同 xff0c 都是按照指针的方式实现 区别 xff1a 1 引用必须初始化 xff0c 指针可以不用
  • 【通信方式一】管道

    管道引入原因 xff1a 由于各个进程之间是相互独立的 xff0c 这样虽然有助于程序内部自己的处理 xff0c 同时也避免各个进程之间相互影响 xff0c 但是有时候程序之间就是需要进行一些信息传递 xff0c 这时就需要相办法来实现这些
  • Linux下的管道组织管理与容量测试

    管道通信方式实现 xff1a http blog csdn net double happiness article details 71685414 在学习完管道的通信方式之后 xff0c 我们知道管道是用来实现进程之间的相互通信的机制
  • 九大排序之——冒泡排序

    冒泡排序 原意是说鱼从水底下吐泡泡 xff0c 然后一直漂浮到水面上的过程 xff0c 冒泡排序就是不断的将一个元素不断的与后面的元素进行比较 xff0c 如果大于 xff08 升序 xff09 就叫交换两个元素的位置 xff0c 直到比较
  • Python解决opencv,cv2.xfeatures2d的办法

    本来要调一下surf特征检测的包但是报错了 xff0c 在查询以后发现cv2 xfeatures2d在opencv3 4 2 16之后的版本不能使用了 那么只好装一下之前的版本 经过多重尝试 xff0c 最后还是通过whl文件的方法去安装p
  • 九大排序之——堆排序

    堆排序 xff1a 思想 xff1a 首先清楚一点堆的低层存储是一个静态数组 xff0c 可以将它看成是一棵完全二树 先建立初始堆 xff0c 然后进行堆调整 xff0c 在进行交换和pop操作 xff0c 直至完成堆排序为止 堆的分类 x
  • 九大排序之——选择排序

    选择排序 xff1a 思想 xff1a 首先将给定的序列看成是一个有序序列和一个无序序列 xff0c 选择排序也就是从给定 的 序列中选取一个最大的 xff08 最小的 xff09 元素放到有序序列的对应位置 xff0c 再从剩余的无序 序
  • 九大排序之——插入排序

    直接插入排序 xff1a 思想 xff1a 将要排序的序列看成两个序列 xff0c 一个是有序序列 xff0c 另一个是无序序列 xff0c 每次取无序序列中的元素往有序序列中的合适位置插入 xff0c 直到无序序列为空 xff0c 排序完
  • 九大排序之——快速排序

    快速排序 算法思想 xff1a 快速排序从名字上就可以看出就是为了排序的效率 xff0c 每次先选择一个关键字key xff0c 一般是选择序列的第一个元素或者序列的最后一个元素 xff0c 将比key值小的元素全部放在左边 xff0c 将
  • 九大排序之——归并排序

    归并排序 算法思想 xff1a 归并操作整体上来看是分治法的应用 xff0c 不断的划分缩小区间 xff1b 图示 xff1a 算法执行步骤 xff1a 1 先申请一个和原序列一样大的空间 xff0c 用来存放合并之后的序列 xff1b 2
  • 九大排序之——计数排序

    计数排序 计数排序步骤 xff1a 1 找出待排序的数组中最大和最小的元素 xff1b 2 统计数组中每个值为i的元素的出现的次数 xff0c 存入数组C的第i项 xff1b 3 对所有的计数累加 xff1b 4 反向填充目标数组 xff1
  • 九大常见排序总结

    九种常基本排序 希尔排序 xff1a http blog csdn net double happiness article details 70157030 冒泡排序 xff1a http blog csdn net double hap
  • 简单的贪吃蛇游戏实现

    贪吃蛇功能实现 xff1a 1 定义贪吃蛇游戏棋盘图 2 初始化棋盘 3 输出棋盘所在信息 3 选择游戏难度 4 随机产生食物 5 更新游戏动态 6 设置游戏相应的操作 7 打印游戏结果 代码实现 span style font famil
  • 深入理解死锁

    死锁定义 死锁是指两个或两个以上的进程在执行过程中 xff0c 由于资源竞争或者由于彼此通信而造成的一种阻塞现象 xff0c 若无外力作用 xff0c 他们都将无法推进下去 xff0c 此时称系统处于死锁状态 xff0c 这些永远在互相等待
  • GDB调试下的多进程与多线程

    主要方法 1 attach方法 2 follow fork mode方法 背景知识 首先要进行调试 xff0c 我们就不得不先搞清楚调试的一些基本操作 gdb Linux调试器 使用 1 产生调试信息 xff1a 要进行代码的调试 xff0
  • Arch/Manjaro pacman安装google-chrome

    谷歌浏览器在Linux下存在好几个版本 xff0c 开源chromuim是默认提供版本 不过个人还是觉得原生版本google chrome stable 最好用 xff01 这个版本存在于清华软件源 xff0c 所以先添加 xff1a ar
  • Linux下的信号(一)

    信号主要是用于不同进程之间进行通信的机制 xff0c 进程之间的相互协作也正是通过发送信号来完成的 xff0c 而信号的本质就是修改PCB中关于信号变量的某个比特位 xff08 至于为什么是一个比特位 xff0c 随后就会做出解释 xff0