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
相关产品推荐
相关产品推荐

