864
33
335
77
举报
发布时间:2024-10-07 18:00
全部评论
大家都在搜:
linux好啊,Linux得学啊!
1年前·北京

6

分享
回复
这么好的教学竟然没人看
1年前·广东

4

分享
回复
...
光看人,教程一句都没看进去[泪奔]
1年前·广东

4

分享
回复
想起来了我二十年前 在学习机上做动画,我把返回键重定义了导致无法退出动画,设置成开机动画,构造出了一个锁屏应用,只有输入特定的组合键才能跳转出动画[泪奔]
1年前·安徽

3

分享
回复
...
话说他这个库函数是怎么接受键盘中断的,具体的系统调用是怎么样的
1年前·黑龙江

1

分享
回复
不行呀,没法认真听课[呲牙]
1年前·广东

1

分享
回复
居然这小姑凉教写代码
1年前·北京

1

分享
回复
其实这些都不对。老师讲错了。
1年前·广东

0

分享
回复
...
[看][看][看]第一
1年前·黑龙江

0

分享
回复
ctrl d呢?
1年前·陕西

0

分享
回复
华清远见小美老师讲嵌入式
华清远见小美老师讲嵌入式

粉丝25.4万获赞122.7万

智能文稿

信号处理:捕获和自定义Ctrl+C、Ctrl+Z等快捷键行为

信号处理基础

信号是操作系统中进程间异步通信的一种方式,用于通知进程发生了某种事件。默认情况下,进程会对特定信号执行预设操作(如终止、暂停等),但通过编程可以捕获信号并自定义处理行为,例如忽略信号或执行特定程序逻辑。

常用信号与对应快捷键

通过kill -l命令可列出系统支持的所有信号及其编号。视频中重点介绍了以下常用信号:

  • SIGINT(信号编号2):对应快捷键Ctrl+C,默认行为是终止进程
  • SIGTSTP(信号编号20):对应快捷键Ctrl+Z,默认行为是暂停进程(暂停后可通过fg命令恢复运行)
  • SIGQUIT(信号编号3):对应快捷键Ctrl+\,默认行为是终止进程并生成核心转储文件

signal函数:注册信号处理函数

在ANSI C中,可通过signal函数注册信号处理函数,原型为:
void (*signal(int signum, void (*handler)(int)))(int);

  • 第一个参数:信号编号(如2表示SIGINT)
  • 第二个参数:函数指针,指向自定义的信号处理函数(该函数接收一个int型参数,即信号编号)

自定义信号处理逻辑

通过signal函数注册处理函数后,可在函数中使用switch-case语句区分不同信号,执行自定义操作(如打印信息、忽略信号等),而非默认的终止/暂停行为。

  • 示例场景:捕获SIGINT(Ctrl+C)时,不终止程序,而是打印"捕获到Ctrl+C"后继续运行
  • 效果:程序不再被快捷键直接杀死,行为更可控("温柔了很多")

无法通过常规快捷键终止时的解决方案

若程序捕获了所有常用信号(如Ctrl+C、Ctrl+Z、Ctrl+\),导致无法通过常规快捷键结束死循环,可使用kill命令主动发送信号强制终止:

  • kill -9 <进程ID>:发送SIGKILL信号(编号9),该信号无法被捕获或忽略,会强制终止进程
  • 操作步骤:先用ps等命令获取进程ID,再执行kill -9 <进程ID>

参考资料

信号处理是Unix/Linux应用层开发的重要内容,推荐参考经典书籍《Unix环境高级编程》(APUE)深入学习。

热榜推荐