Android 信号处理面面观 之 概述

来源:互联网 发布:淘宝买药不是直接付款 编辑:程序博客网 时间:2024/05/16 17:05

首先澄清,本文讨论的信号是 Linux 软中断信号,而不是手机状态条里面用于显示当前手机通信强度的那个信号。 本文是 增量型博客,内容会不断更新,请改话题感兴趣的朋友偶尔可以再回头来看看更新的内容。


我们知道,Unix系统里信号是一种软中断。尽管本身存在缺陷(后面会讨论到),但是作为Unix系统重要的异步事件处理方式之一,在Unix系统中发挥重要的作用。可以说,所有Unix系统(包括Linux)都不可能忽略信号的支持。 Android 本质上也是个在 Linux 系统,自然也少不了对 信号处理的支持。


但我们也知道,Android和其他Linux系统一个很大的差异就是增加了虚拟机的支持(Dalvik vm),所有的应用程序都会在虚拟机实例里运行 (当然,虚拟机实例还是在传统的进程里运行)。为了更好的支持应用程序的开发和调试,Android对信号的处理增加了额外的逻辑(下面会详细讨论到)。这也使得 Android系统中信号的处理行为和传统的Linux系统有所区别。 很多朋友,在开始接触 Android信号处理时,可能也会碰到一些困惑。尽管其实答案很简答, 但是网上这方面的资料少,还是需要花不少时间去摸透。 本文写作的目的就是试图 将 android信号处理的方方面面呈现给大家。 让大家在最短的时间内掌握android信号处理的知识,并学以致用。


虽然,android 信号处理并不复杂,但是如果用一篇文章还真难以描述清楚而又有条理。所以对信号处理打算分几部分讨论:

1. 概述  就是本文。 简述 Android 系统对信号处理的概貌,并说明测试环境。

2. 信号产生。讨论 android信号的产生原因以及最简单的测试方法。

3. 信号处理。 讨论Android系统对传统的信号处理的扩展是怎么实现的。

4. 应用扩展。 讨论在实际开发中,怎样利用android信号机制为我们服务。


请读者先看看自己对 Android信号处理的了解程度再决定是否需要 花时间关注该系列的博文。以下是几个相关的问题:

1. Android信号处理比起传统的linux系统(如 Ubuntu)有什么区别么?

2. Android信号来源于哪里?怎样用最简单的方式产生信号,并测试信号处理的行为。?怎样才能最快的分析有信号处理产生的问题?

3. Android是如何实现对传统信号处理的扩展。

4. 我们日常开发中,Android信号处理机制可以帮助我们处理那类问题?


如果你能回答全部问题,恭喜你。你对Android信号处理的理解别我深(请留下联系方式,有事我好请教你)。如果有些问题你不能回答,这个系列的文章正是帮你补充这方面的知识。


本文的测试环境是:

模拟器: Ubuntu 11.04 运行 最新的Android 4.0.1 模拟器 (搭配相关的环境请看 Android4.0.1 源码下载,模拟器编译和运行  一文)

手机: Droid3 with android 2.3.6

平板: Xoom2 with android 3.2

除非有行为上得差异,否则所有测试结果都将出自 模拟器(方便,呵呵)


对了,上面提到的传统信号处理模型的缺陷,主要是有如下几个点:

1. 难以扩展。 这可能是历史原因造成的,早期信号处理模型中,为了效率和方便,大多使用整型位码来表示某一信号。而总数控制在32位之内。大多数已经有明确的含义,而大多只提供 SIGUSR1 和 SIGUSR2供用户使用。

2. 某些情境下的行为不可靠。比如相同的信号连续到达后,大多只作为一个信号处理。也就是说你只能知道该信号是否到达,而不能确定到达了一个还是是个。

对于,缺陷1,似乎没有什么好办法(总不能另外造出信号类型啊)。而可行的方法就是重用这两个信号。

对于缺陷2,如果需要连续产生相同的信号而又要处理,可以在期间加入延迟。后面会看到 Android就是这么做的。


如果有问题想讨论或纠正我的错误,请留言。我会尽快回复,或者直接在正文中增加改话题的讨论。谢谢。

原创粉丝点击