使用Fortran获取系统信息

时间:2018-03-06 22:31:04

标签: fortran gfortran fortran90 preprocessor

我对通过Fortran获取系统信息感兴趣 - 类别可能包括:

  1. 操作系统名称
  2. 操作系统版本
  3. CPU架构(32/64位)
  4. 核心数
  5. 我的理解是你可以通过预处理指令获得基本的操作系统信息,例如

    #ifdef _WIN32
      print *,'Windows'
    #ifdef _APPLE_
      print *,'macOS'
    #ifdef __linux
      print *,'Linux'
    #endif
    

    这是第1类的工作解决方案,但仍然留下2 - 4.

    谢谢!

3 个答案:

答案 0 :(得分:2)

你可以在Fortran做所有这些事情,除非没有。 COMPILER_VERSION()模块中的ISO_FORTRAN_ENV字符串应至少提供操作系统的名称。从那里你知道要调用哪些程序来获取更多信息。

program test
   use ISO_C_BINDING
   use ISO_FORTRAN_ENV
   implicit none
   integer, parameter :: bitness = bit_size(0_C_INTPTR_T)
   write(*,'(*(g0))') 'This is a ',bitness,'-bit system.'
   write(*,'(*(g0))') COMPILER_VERSION()
end program test

这是我与gfortran的输出:

This is a 64-bit system.
GCC version 7.2.0

所以gfortran不是很有帮助。我认为这是一个错误。 ifort根本没有COMPILER_VERSION();也许这只是因为我有两个编译器的旧版本。无论如何,如果您可以从COMPILER_VERSION()字符串获取操作系统,您就会知道如何在Windows中加载有用的函数,如LoadLibraryGetProcAddress。然后,如果没有正确的操作系统,则创建具有所需操作系统过程名称的参数,如果没有,则创建存根过程的名称。

   logical, parameter :: v0 = index(v5,'WINDOWS') /= 0
   character(*), parameter :: v6 = merge('LoadLibraryA','Stub12345678',v0)
   interface
      function LoadLibrary(lpFileName) bind(C,name=v6)
         import
         implicit none
!DEC$ ATTRIBUTES STDCALL :: LoadLibrary
!GCC$ ATTRIBUTES STDCALL :: LoadLibrary
         integer(C_INTPTR_T) LoadLibrary
         character(kind=C_CHAR) lpFileName(*)
      end function LoadLibrary
   end interface

这样,如果您在Windows中,则可以访问LoadLibrary,如果不是,则不会导致不满意的外部参考。不幸的是,gfortran并不认为具有命名常量而不是绑定名称的字符文字是有效的。

但是原则上你可以使用编译器告诉你操作系统名称并设置一些关键功能,你需要操作系统来完成剩下的工作,但它需要一个比我更高级的编译器。如果你有一个更好的编译器,我可以编辑更多东西,你可以看到它是否崩溃了。

答案 1 :(得分:2)

一旦你按照问题中显示的方式完成了第1点,你可以继续使用其他点。

在POSIX系统(包括Linux)中,您可以执行

uname -a

获取操作系统名称和版本信息,如

Linux meop37 4.4.104-18.44-default #1 SMP Thu Jan 4 08:07:55 UTC 2018 (05a9de6) x86_64 x86_64 x86_64 GNU/Linux

您可以将其存储在文件中并读取文件Fortran(只需重定向标准输出)。

在Linux中,您可以阅读/etc/os-release以查找操作系统版本。

就我而言,它包括:

NAME="openSUSE Leap"
VERSION="42.2"
ID=opensuse
...

在Linux中,您可以阅读/proc/cpuinfo以获取有关CPU的大量信息(包括您请求的信息)。你有责任在Fortran中以某种方式解析它。

在我的情况下,它包含:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 58
model name      : Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
stepping        : 9
microcode       : 0x1c
cpu MHz         : 1693.800
cache size      : 8192 KB
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
...

我对MS Windows一无所知。你的问题非常(太?)广泛,所以我认为回答它的一部分是可以接受的。

答案 2 :(得分:0)

我在Windows 10中给出了体系结构和详细系统信息的答案。(也许它可以在其他Windows系统中运行。)

program info
implicit none
print*,'detail system information: (on Windows 10)'
call system('SystemInfo')
print*
read(*,*)
print*,'system architecture:'
call system('wmic OS get OSArchitecture')
print*
end program

我使用帮助from来获取架构。通常子例程call system(String_variable)启动cmd行并获取系统命令。以类似的方式在Ubuntu中启动终端并获取shell命令。 (系统命令对于不同的操作系统显然是不同的。)