Linux下的信号(二)

2023-05-16

相关博客

Linux下的信号(一)

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


信号的四种产生方式


(一)通过键盘上的某些组合键完成

(二)由硬件产生信号

****前面两种在上一篇中已经详细介绍过了,再次就不在叙述

(三)调用相应的函数实现


1)调用kill函数

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
功能:一个进程调用kill(2)函数可以发送信号给另一个进程;如果不明确指定信号则发送SIGTERM信号,该信号的默认处理动作是终止进程
返回值:成功返回0,失败返回-1


2)使用raise函数

 #include <signal.h>
 int raise(int sig);
功能:每隔一段时间,自己给自己发送一个信号

返回值:成功返回0,失败返回-1;


3)调用abort函数

#include <stdlib.h>
void abort(void);
功能:终止一个进程,可以被捕获,但必须被终止

返回值:这个返回值比较特殊,就像我们前面在进程替换中学习的exec函数族一样,只有出错返回值,没有成功返回值。


*****几个函数的比较


1)kill和raise函数的区别


kill:可以给任意进程发送任意信号

raise:只能给自己发送任意信号


(2)exit和abort函数的区别


exit:正常退出

abort:异常退出


(四)由软件条件产生信号

#include <unistd.h>
unsigned int alarm(unsigned int seconds)
功能:设置一个闹钟,参数为闹钟的秒数

返回值:返回值为闹钟的剩余时间


阻塞信号

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


信号捕捉


信号捕捉的时机:从系统态切换回用户态的时候


信号捕捉流程


1)主流程因为指令中断或异常转而进入内核态,处理完返回用户态时,先处理当前进程中可以递送的信号;

2)若信号的处理动作是自定义的转而去执行自定义动作流程;

3)自定义函数处理完毕返回时,再次进入内核态;

4)执行完毕从内核态返回用户态时,到达主流程当时中断或者异常处继续执行。


图示表示




sigaction


#include <signal.h>
int sigaction(int signum, const struct sigaction *act,   struct sigaction *oldact);

功能:读取和修改与指定信号相关联的处理动作


参数说明:

signum:指定信号的编号

act:若指针非空,根据act修改该信号的处理动作

cldact:若指针非空,通过oldact传出原来的处理动作


sigaction结构体



结构体成员变量说明:

sa_handler:赋值为常数SIG_IGN传给sigaction表示忽略信号;赋值为常数SIG_DFL表示执行系统默认动作,赋值为一个函数指针表示用自定义函数捕捉信号。 向内核注册了一个信号处理函数,该函数返回值为void,可以带一个int参数,通过参数可以得知当前信号的编号,这样就可以用同一个函数处理多种信号。显然,这也是一个回调函数,不是被main函数调用,而是被系统所调用。

sa_mask:进程的信号屏蔽字。如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。

sa_flags:sa_flags字段包含一些选项,本文代码把sa_flags设为0。

sa_sigaction是实时信号的处理函数。


可重入函数

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


pause与竟态条件

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


SIGCHLD信号

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

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

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

  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • Mono 和 WebRequest 速度 - 测试

    在 mono 4 6 2 linux 中 我注意到 wget 下载文件的速度与webclient DownloadString 所以我做了一个小测试来调查 为什么 wget 明显比 C 快 根据我自己的实验 使用 wget 下载 手动读取文
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

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

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • jpackage linux 创建的桌面文件不足

    我刚刚开始使用 jpackage 它是一个非常棒的工具 只要迈出一步 我的肩上的工作就减轻了很多 我对看起来硬编码且无法定制的东西越感到惊讶 JPackage 自动生成启动器 lib
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • /proc/PID 文件格式

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

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • 如何从“git log”中查看 Git 中的特定版本?

    My git log显示为 enter code here git trial git log commit 4c5bc66ae50780cf8dcaf032da98422aea6e2cf7 Author king lt email pro
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • 如何仅将整个嵌套目录中的头文件复制到另一个目录,在复制到新文件夹后保持相同的层次结构

    我有一个目录 其中有很多头文件 h 和其他 o 和 c 文件以及其他文件 这个目录里面有很多嵌套的目录 我只想将头文件复制到一个单独的目录 并在新目录中保留相同的结构 cp rf oldDirectory newDirectory将复制所有

随机推荐

  • 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
  • 浅析重载、隐藏与覆盖

    重载 重载又称为静态多态 xff0c 静态绑定 xff0c 静态决议等 因为要实现重载 xff0c 所以C 43 43 和C的命名方式有所不同 重载主要是为了减轻程序员对函数名的记忆负担 xff0c 让所有功能相似的函数使用同一名字 重载条
  • Linux下的信号(二)

    相关博客 Linux下的信号 xff08 一 xff09 http blog csdn net double happiness article details 72848372 信号的四种产生方式 一 通过键盘上的某些组合键完成 二 由硬