2011-08-03 24 views
11

¿Alguien sabe de una manera de dormir por un determinado número de milisegundos en Fortran? No quiero utilizar llamadas de sistema no portátiles, por lo que se preferiría cualquier elemento intrínseco de las bibliotecas Fortran o C.Dormir en Fortran

+0

Hay una subrutina 'reposo' que toma varios segundos como argumento pero no estoy seguro de dónde viene eso (¿envoltura para la función C?). Parece funcionar bien para lo que intento. Estoy usando el Intel Fortran Compiler 12 en una PC. –

+0

Acabo de encontrar un programa Fortran que usa un sistema de llamadas (no estándar) (char_arg) que accede al sistema sin gastos generales de la CPU. Lo probé con pgf90, ifort y gfortran, todo está bien con él. Por lo tanto, uno podría hacer algo como llamar al sistema ('sleep' // number_of_seconds_string) para obtener una función de suspensión. No tuve la oportunidad de probar esto con otros compiladores. – milancurcic

Respuesta

9

Utilizando el Fortran ISO C Encuadernación utilizar el sueño de la biblioteca C para dormir en unidades de segundos:

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 
+0

¿Crees que la función 'dormir' provista dentro de Intel Fortran básicamente está haciendo lo mismo que proporcionó anteriormente? –

+0

Sí, la funcionalidad es probablemente la misma. Una subrutina similar está disponible en gfortran. Esta es una extensión que podría no ser parte de algún otro compilador. –

+1

Hola, en Linux podría usar esto y funciona bien. En Windows y al utilizar MinGW, al compilarse se queja de que no puede encontrar la función Sleep. ¿Sabes cómo arreglar ésto? –

4

Usted puede usar Fortran funciones intrínsecas estándar de hacer esto sin C vinculante:

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 

Suponiendo que el ejecutable es slp:

~$ time slp 1234 

real  0m1.237s 
user  0m1.233s 
sys   0m0.003s 

Añadir un caso especial de este programa si y O te preocupa que se rompa alrededor de la medianoche :)

+3

Lo que me recuerda. Este enfoque definitivamente no debe usarse si necesita tiempo de CPU durante el período de sueño. Supuse que no es así por mucho tiempo espera por datos remotos. Si lo hace, es mucho mejor usar un contenedor de shell, porque el ejemplo anterior es intensivo en CPU. – milancurcic