如何记录键盘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

相关文章

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

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、路由模块添加前缀 四、中间件