Linux驱动编程之信号机制

编写Linux驱动的过程中,需要考虑与应用程序交互的情况。当设备驱动完成某项任务或者达到某种状态的时候(如设备文件可以写入或读取),此时可以让驱动程序主动通知应用程序进行相应的处理(个人感觉类似于Android应用程序中的广播)。这种在Linux内核中使用的“广播”就是本文要详细介绍的“信号”。

1. Linux信号类型

使用信号进行进程间通信(IPC)是LInux系统的重要通信机制。在Linux系统中,异步通知使用信号来实现。以下是Linux系统支持的信号及其含义:(asm/signal.h)

#define SIGHUP       1
#define SIGINT       2
#define SIGQUIT     3
#define SIGILL       4
#define SIGTRAP     5
#define SIGABRT     6
#define SIGIOT       6
#define SIGBUS       7
#define SIGFPE       8
#define SIGKILL     9
#define SIGUSR1     10
#define SIGSEGV     11
#define SIGUSR2     12
#define SIGPIPE     13
#define SIGALRM     14
#define SIGTERM     15
#define SIGSTKFLT     16
#define SIGCHLD     17
#define SIGCONT     18
#define SIGSTOP     19
#define SIGTSTP     20
#define SIGTTIN     21
#define SIGTTOU     22
#define SIGURG       23
#define SIGXCPU     24
#define SIGXFSZ     25
#define SIGVTALRM     26
#define SIGPROF     27
#define SIGWINCH       28
#define SIGIO         29
#define SIGPOLL     SIGIO
#define SIGPWR       30
#define SIGSYS       31

/* These should not be considered constants from userland.  */
#define SIGRTMIN       32
#define SIGRTMAX       _NSIG

#define SIGSWI       32

注:以上除了SISSTOP和SIGKILL两个信号外,进程可以忽略或捕获其他的全部信号。

如果其中一个信号被捕获,说明在应用程序中为该信号指定了一个处理函数。如果一个信号没有被某个进程捕获,Linux内核会对该信号采用默认处理方式进行处理。

2. 接收Linux信号

在用户程序中,为了捕捉信号,需要使用signal函数来设置信号接收的回调函数:

void  (*signal(int signum, void (* handler)(int)))(int);

从signal函数原型上看有些复杂, 但主要有两个参数:signum和handler,signum表示信号代码,handler表示回调函数。

在应用程序中捕获信号比较简单,如下例子:

void signal_handler(int signo)
{
        printf("捕获到%d信号\n",signo);
}
main()
{
        printf("信号ID是%d\n",getpid());
        signal(SIGINT, signal_handler);            //设置SIGINT信号的处理函数
        signal(SIGHUP, signal_handler);          //设置SIGHUP信号的处理函数
        signal(SIGQUIT, signal_handler);         //设置SIGQUIT信号的处理函数
       getchar();
}

以上代码示例了如何捕捉信号,并设置相应的处理函数。

3、发送信号

在设备驱动和应用程序的异步通知过程中,驱动程序需要向应用程序发出信号,为了完成发送信号的任务,需要完成以下工作:

  1. 支持F_SETDOWN命令。通过这个命令可以设置file_f_owner为对应进程的ID。
  2. 支持F_SETFL命令的处理。每当FASYNC标志改变时,驱动程序中的fasync函数就会执行。
  3. 再满足条件时,调用kill_fasync函数发送相应的信号。

接收信号可以用signal函数和sigaction函数来完成,他们之间有以下几个区别:
signal函数
1、signal在调用handler之前先把信号的handler指针恢复;sigaction调用之后不会恢复handler指针,直到再次调用sigaction修改handler指针。
:这样,(1)signal就会丢失信号,而且不能处理重复的信号,而sigaction就可以。因为signal在得到信号和调用handler之间有个时间把handler恢复了,这样再次接收到此信号就会执行默认的handler。(虽然有些调用,在handler的以开头再次置handler,这样只能保证丢信号的概率降低,但是不能保证所有的信号都能正确处理)
2、signal在调用过程不支持信号block;sigaction调用后在handler调用之前会把屏蔽信号(屏蔽信号中自动默认包含传送的该信号)加入信号中,handler调用后会自动恢复信号到原先的值。
(2)signal处理过程中就不能提供阻塞某些信号的功能,sigaction就可以阻指定的信号和本身处理的信号,直到handler处理结束。这样就可以阻塞本身处理的信号,到handler结束就可以再次接受重复的信号。

在驱动程序编写过程中与应用程序进行交互是非常重要的,他可以确保用户程序能够顺利执行,也能保证驱动能够更好地服务于用户。以上是本人学习中的一些总结,希望对大家有帮助~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容