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

Fortran信号处理时I/O递归调用崩溃,求CLEAR_ALL_IO类解决方案

Fortran信号处理与I/O递归冲突问题

测试代码

PROGRAM TEST
  EXTERNAL TARGET
  CALL SIGNAL (2,TARGET)
  OPEN (1,FILE='/dev/null')
  WRITE (6,*) 'first step'
  DO I=1,100000
  DO J=1,10000
    K=I*J
    ENDDO
    ENDDO
  WRITE (6,*) 'second step'
  WRITE (1,'(A)') ((' ',I=1,10000),J=1,10000)
  WRITE (6,*) 'third step'
  STOP
END 
SUBROUTINE TARGET
  WRITE (6,*) 'target reached'
  STOP
END 

问题现象

  • 程序运行至first step对应的双层计算循环时,按下^C可正常触发信号处理子程序TARGET,程序按预期响应
  • 运行至second step对应的大尺寸I/O写入阶段时,按下^C会导致程序直接终止,无法进入TARGET处理逻辑,原因是I/O系统无法处理递归调用

当前临时方案与痛点

目前采用COMMON变量标记、在耗时循环中检查信号的临时方案,但需要修改大型程序中的所有循环,操作十分繁琐。期望能在TARGET子程序中加入类似CALL CLEAR_ALL_IO的指令,直接清理I/O状态以解决冲突。

版本兼容性

  • 该问题在g77(gcc 3.4.6)及旧版gfortran中存在
  • gfortran 9.4.0已修复此问题
  • 代码中写入/dev/null是为避免干扰测试终端,后续会反馈真实信号处理器的测试结果

内容的提问来源于stack exchange,提问作者PIETRO SPIZZO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:04:56