Fortran睡眠调用不会阻止程序

问题描述

我有最基本的Fortran程序:

program sleep
    print*,"Sleeping"
    call sleep(30)
    print*,"Done"
end program sleep
我使用gfortran sleep.f90(版本9.3.0)进行编译的

。据我从sleep文档中了解到,该程序应该休眠30秒钟,也就是说,我应该期望在“休眠”后30秒钟看到“完成”打印。不会发生这种情况:我看到两个打印语句都立即出现,表明call sleep(30)不会以任何方式阻塞我的程序。进行call sleep(10000)没有任何区别。我正在Linux的Windows子系统(WSL Ubuntu 20.04)上编译和运行此程序。

解决方法

因此,通过@roygvib在评论中建议的解决方案组合来解决此问题。主要问题是WSL(Ubuntu 20.04)环境中的sleep已损坏。第一步是将损坏的/usr/bin/sleep替换为this Python script

#!/usr/bin/env python3

import sys
import time

time.sleep(int(sys.argv[1]))

然后,修改Fortran程序以对该新的system可执行文件进行sleep调用:

program sleep
    print*,"Sleeping"
    call system("sleep 30")
    print*,"Done"
end program sleep

在WSL的下一次更新之前,此hack必须要做。

,

sleep过程不是Fortran标准的一部分,并且不可移植。这是一个可能会在使用任何符合标准的Fortran编译器的所有系统上工作的解决方案:

module sleep_mod

    use,intrinsic :: iso_fortran_env,only: IK => int64,RK => real64,output_unit
    implicit none

contains

    subroutine sleep(seconds)

        implicit none

        real(RK),intent(in) :: seconds ! sleep time
        integer(IK)          :: countOld,countNew,countMax
        real(RK)             :: countRate

        call system_clock( count=countOld,count_rate=countRate,count_max=countMax )
        if (countOld==-huge(0_IK) .or. nint(countRate)==0_IK .or. countMax==0_IK) then
            write(output_unit,"(A)") "Error occurred. There is no processor clock."
            error stop
        end if

        countRate = 1._RK / countRate
        do
            call system_clock( count=countNew )
            if (countNew==countMax) then
                write(output_unit,"(A)") "Error occurred. Maximum processor clock count reached."
                error stop
            end if
            if ( real(countNew-countOld,kind=RK) * countRate > seconds ) exit
            cycle
        end do

    end subroutine sleep

end module sleep_mod

program main
    use sleep_mod,only: output_unit,sleep,RK
    implicit none
    write(output_unit,"(A)") "Sleep for 5 second."
    call execute_command_line(" ") ! flush stdout
    call sleep(seconds = 5._RK)
    write(output_unit,"(A)") "Wake up."
end program main

您可以在此处在线测试:https://www.tutorialspoint.com/compile_fortran_online.php

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...