Sleep in Fortran
11,268
Solution 1
Using the Fortran ISO C Binding to use the C library sleep to sleep in units of seconds:
module Fortran_Sleep
use, intrinsic :: iso_c_binding, only: c_int
implicit none
interface
! should be unsigned int ... not available in Fortran
! OK until highest bit gets set.
function FortSleep (seconds) bind ( C, name="sleep" )
import
integer (c_int) :: FortSleep
integer (c_int), intent (in), VALUE :: seconds
end function FortSleep
end interface
end module Fortran_Sleep
program test_Fortran_Sleep
use, intrinsic :: iso_c_binding, only: c_int
use Fortran_Sleep
implicit none
integer (c_int) :: wait_sec, how_long
write (*, '( "Input sleep time: " )', advance='no')
read (*, *) wait_sec
how_long = FortSleep ( wait_sec )
write (*, *) how_long
stop
end program test_Fortran_Sleep
Solution 2
You can use Fortran standard intrinsic functions to do this without C binding:
program sleep
!===============================================================================
implicit none
character(len=100) :: arg ! input argument character string
integer,dimension(8) :: t ! arguments for date_and_time
integer :: s1,s2,ms1,ms2 ! start and end times [ms]
real :: dt ! desired sleep interval [ms]
!===============================================================================
! Get start time:
call date_and_time(values=t)
ms1=(t(5)*3600+t(6)*60+t(7))*1000+t(8)
! Get the command argument, e.g. sleep time in milliseconds:
call get_command_argument(number=1,value=arg)
read(unit=arg,fmt=*)dt
do ! check time:
call date_and_time(values=t)
ms2=(t(5)*3600+t(6)*60+t(7))*1000+t(8)
if(ms2-ms1>=dt)exit
enddo
!===============================================================================
endprogram sleep
Assuming the executable is slp:
~$ time slp 1234
real 0m1.237s
user 0m1.233s
sys 0m0.003s
Add a special case to this program if you are worried it will break around midnight :)
Author by
Brian Triplett
Updated on June 04, 2022Comments
-
Brian Triplett almost 2 years
Does anyone know of an way to sleep for a given number of milliseconds in Fortran? I do not want to use non-portable system calls so anything intrinsic to Fortran or C libraries would be preferred.
-
Brian Triplett over 12 yearsdo you think the 'sleep' function provided inside of Intel Fortran is basically doing the same thing you provided above?
-
M. S. B. over 12 yearsYes, the functionally is probably the same. A similar subroutine is available in gfortran. This is an extension that might not be part of some other compiler.
-
milancurcic over 12 yearsWhich reminds me. This approach should definitely not be used if you need cpu time during sleep period. I assumed you do not this for long waits for remote data. If you do, you are far better off using a shell wrapper, because example above is cpu intensive.
-
Hossein Talebi about 10 yearsHi, in Linux I could use this and it works fine. In Windows and using MinGW, when compiling it complains that it cannot find Sleep function. Do you know how to fix this?
-
zbeekman over 5 yearsThis answer is definitely more portable than the accepted answer.
-
zbeekman over 5 yearsThis solution is not portable across OSes. (*nix only, I believe.) @milancurcic 's answer below should work across all OSes.
-
Dan Sp. over 5 yearssystem_clock is still non-portable. It may behave differently on different systems/different compilers. Check out this answer already.
-
Vladimir F Героям слава over 5 yearsIt is portable, but one has to query the clock rate and use the value one gets. Also, this is just busy wating en.wikipedia.org/wiki/Busy_waiting, not proper sleeping.
-
Vladimir F Героям слава over 5 yearsIt is slightly more portable, but it is busy waiting, not proper sleeping, so the accepted answer is the right one to be accepted.
-
Shriraj Hegde almost 2 yearsThis is busy waiting, this can't really be considered as sleep.