如何在GFORTH中捕获/禁用CTRL+C?
GForth 0.7.* 处理Ctrl+C的两种实用方案
我常用case...endcase语句处理按键操作,但用户仍能触发CTRL+C中断流程。需要实现两个目标:要么在toto这类词中临时禁用CTRL+C,完成按键识别(比如处理81、49、50等按键对应的操作)后再恢复;要么把CTRL+C捕获到指定词(比如exitonctrlc)执行,但在GFORTH 0.7.*官方文档里没找到现成方法。以下是两种可行方案:
方案一:临时禁用/恢复CTRL+C
GForth通过信号机制处理CTRL+C(对应SIGINT信号),我们可以先保存原信号处理逻辑,临时设置为忽略SIGINT,处理完按键后再恢复。
\ 定义变量保存原信号处理函数 variable old-sigint-handler : disable-ctrlc sigint @ old-sigint-handler ! \ 备份当前SIGINT处理逻辑 ' ignore sigint ! \ 设置为忽略CTRL+C ; : enable-ctrlc old-sigint-handler @ sigint ! \ 恢复原处理逻辑 ; : toto \ 执行前置操作 disable-ctrlc \ 进入按键处理前禁用CTRL+C key case 81 of exitprog endof 49 of manage1 endof 50 of manage2 endof \ 其他按键处理分支 endcase enable-ctrlc \ 处理完成后恢复CTRL+C ;
说明:ignore是GForth内置的信号忽略函数,sigint是对应SIGINT信号的变量,用于读取或设置信号处理函数。
方案二:捕获CTRL+C到自定义词执行
如果希望按下CTRL+C时直接执行自定义逻辑,只需把SIGINT的处理函数绑定到exitonctrlc即可:
: exitonctrlc ." 捕获到CTRL+C,执行清理..." cr dostuff \ 执行你的自定义处理代码 0 (bye) \ 退出程序 ; \ 程序初始化时设置信号绑定 ' exitonctrlc sigint ! : toto \ 正常按键处理逻辑 key case 81 of exitprog endof 49 of manage1 endof 50 of manage2 endof \ 其他按键处理分支 endcase ;
这样用户按下CTRL+C时,会直接触发exitonctrlc中的逻辑,替代默认的程序中断。
内容的提问来源于stack exchange,提问作者francois P
相关产品推荐
相关产品推荐

