You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:06:07