如何记录键盘SIGQUIT次数

2024-04-26 02:38
文章标签 记录 次数 键盘 sigquit

本文主要是介绍如何记录键盘SIGQUIT次数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Unix信号

在计算机科学中,信号(英语:Signals)是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。

信号类似于中断,不同之处在于中断由处理器调解并由内核处理,而信号由内核调解(可能通过系统调用)并由进程处理。内核可以将中断作为信号传递给导致中断的进程(典型的例子有SIGSEGV、SIGBUS、SIGILL和SIGFPE)。

发送信号

在一个运行的程序的控制终端键入特定的组合键可以向它发送某些信号:

  • Ctrl-C发送INT信号(SIGINT);默认情况下,这会导致进程终止。
  • Ctrl-Z发送TSTP信号(SIGTSTP);默认情况下,这会导致进程挂起。
  • Ctrl-\发送QUIT信号(SIGQUIT);默认情况下,这会导致进程终止并且将内存中的信息转储到硬盘(核心转储)。

kill()系统调用会在权限允许的情况下向进程发送特定的信号,类似地,kill命令允许用户向进程发送信号。raise(int signal)库函数可以将特定信号发送给当前进程。

关于SIGQUIT的官网文档解释

文档在这里https://developer.apple.com/library/archive/technotes/tn2151/_index.html,搜索SIGQUIT即可快速定位到。翻译大概是这样的。

该进程在另一个具有管理该进程生命周期特权的进程请求下停止的。SIGQUIT不意味着该进程已崩溃,但是它确实被检测出来发生错误了。

在iOS中,如果键盘加载时间过长,宿主进程会给键盘扩展发送SIGQUIT信号。崩溃日志中显示的调用栈回溯信息没有太多的用途。最有可能发生SIGQUIT的原因是,键盘扩展的启动过程的代码花费了很长时间才能完成,但是确实在时间限制内完成了,但当SIGQUIT发出SIGQUIT信号时,代码已经执行到日志中显示的调用栈回溯信息中了。您应该对键盘扩展进行分析,以更好的了解键盘启动时都做了些什么事情,然后将一些不必要的事情移到子线程或者推迟到键盘加载完毕之后再执行。

处理信号

信号处理函数可以通过signal()系统调用来设置。如果没有为一个信号设置对应的处理函数,就会使用默认的处理函数,否则信号就被进程截获并调用相应的处理函数。在没有处理函数的情况下,程序可以指定两种行为:忽略这个信号(SIG_IGN)或者用默认的处理函数(SIG_DFL)。但是有两个信号是无法被截获并处理的:SIGKILL和SIGSTOP。

风险

因为竞态条件的存在,信号的处理是有弱点的。因为信号是异步的,所以在处理一个信号的过程中,进程可能收到另一个信号(甚至是相同的信号)。sigprocmask()系统调用可以用来阻塞和恢复信号的传递。信号可以造成进程中系统调用的中断,并在信号处理完后重新开始未完成的系统调用。信号处理函数应该没有任何不想要的副作用,比如,errno的改变、信号掩码的改变、信号处理方法的改变,以及其他全局进程性质的改变。在信号处理函数内使用不可重入函数,如mallocprintf,也是不安全的。

测试iOS键盘的SIGQUIT信号处理机制是SIG_IGN还是SIG_DFL

上面我们说到:在没有处理函数的情况下,程序可以指定两种行为:忽略这个信号(SIG_IGN)或者用默认的处理函数(SIG_DFL)。那我们来测试iOS键盘的SIGQUIT信号处理机制是SIG_IGN还是SIG_DFL

测试方案:新建一个空的键盘项目,我们在ViewDidLoad函数中,随机做一些时长为0ms~3000ms的耗时操作。同时在+(void)load函数中进行打印。在iOS11设备上进行测试。测试流程为频繁的调起键盘并收起键盘,最终通过log查看结果。

经测试在已有的三类设备中:iOS11设备复现SIGQUIT的几率较高,iOS9和iOS13复现的几率极低。
当我们不做任何signal处理时
默认	10:55:16.767137+0800	Keyboard	----- SGIDebug +[KeyboardViewController load] processID:8239
默认	10:55:22.399583+0800	Keyboard	----- SGIDebug viewDidLoad time : 594.86ms processID:8239
默认	10:55:22.589510+0800	Keyboard	----- SGIDebug +[KeyboardViewController load] processID:8241
默认	10:55:30.203572+0800	Keyboard	----- SGIDebug viewDidLoad time : 1762.28ms processID:8241
默认	10:55:32.229868+0800	Keyboard	----- SGIDebug viewDidLoad time : 1898.79ms processID:8241
默认	10:55:33.230580+0800	Keyboard	----- SGIDebug viewDidLoad time : 409.31ms processID:8241
默认	10:55:34.979780+0800	Keyboard	----- SGIDebug +[KeyboardViewController load] processID:8243
默认	10:55:43.241684+0800	Ke

这篇关于如何记录键盘SIGQUIT次数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936497

相关文章

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字,这样可以显著提高打字速度和效率。以下是一些练习盲打的方法: 熟悉键盘布局:首先,你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具:有许多在线的打字练习网站,如Typing.com、10FastFingers等,它们提供了不同难度的练习和测试。 练习基本键位:先从学习手指放在键盘上的“家位”开始,通常是左手的

Linux常用工具与命令日常记录(长期更新)

Linux常用工具与命令日常记录(长期更新) 目录 1.本地复制到远程2.Linux压缩拆包与解压3.生成随机密码4.ubuntu默认Python版本设置5.计算当前文件夹中文件数量6.windows中编写shell脚本,在Linux运行出错7.history 历史命令显示时间用户8.Ubuntu18.04设置源、网卡9.Ubuntu18.04设置网卡10.Ubuntu:自定义开