本文共 1420 字,大约阅读时间需要 4 分钟。
信号机制是UNIX系统中最为古老的进程间通信机制,能够产生多种信号。信号的产生主要有以下几种情况:
kill
函数将信号发送给其他进程。kill
命令将信号发送给其他进程。常见的信号类型包括:
kill
命令发出的信号。信号处理主要有三种方式:
kill
和raise
是发送信号的主要函数:
kill
可以向自身或其他进程发送信号。raise
只能向自身发送信号。kill
函数的pid
参数有四种情况:
pid > 0
:发送给特定进程ID的进程。pid = 0
:发送给同组的进程。pid < 0
:发送给进程组ID等于|pid|
的进程。pid = -1
:发送给所有进程。alarm
函数用于设置闹钟时间,时间到时会产生SIGALRM
信号。如果未捕捉,默认动作是终止进程。
pause
函数使进程挂起,直到捕捉到信号。signal
函数用于注册信号处理函数,有三种处理方式:
SIG_IGN
)。SIG_DFL
)。实例测试:
#include#include #include void my_func(int sign_no) { if (sign_no == SIGINT) { printf("I have get SIGINT\n"); } else if (sign_no == SIGQUIT) { printf("I have get SIGQUIT\n"); }}int main() { printf("Waiting for signal SIGINT or SIGQUIT\n"); signal(SIGINT, my_func); signal(SIGQUIT, my_func); pause(); exit(0);}
测试方法:
kill -s SIGQUIT + PID
发送信号,观察输出结果。按键驱动异步通知:
signal(SIGIO, my_signal_fun)
。buttons_irq
中调用kill_fasync
函数。驱动程序实现关键步骤:
F_SETOWN
命令。F_SETFL
命令处理,调用fasync
函数。kill_fasync
函数发送信号。总结:支持异步通知需要完成以下工作:
filp->f_owner
为目标进程ID(由内核完成)。fasync
函数,处理FASYNC
标志改变。kill_fasync
函数,发送相应信号。转载地址:http://trwfk.baihongyu.com/