使用 Fortran 获取系统信息

Get system information with Fortran

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

  1. 操作系统名称
  2. 操作系统版本
  3. CPU 体系结构(32/64 位)
  4. 核心数

据我了解,您可以通过预处理指令获取基本的 OS 信息,例如

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

这是第 1 类的有效解决方案,但仍保留第 2 - 4 类。

谢谢!

你可以用 Fortran 做所有这些事情,但不是真的。 ISO_FORTRAN_ENV 模块中的 COMPILER_VERSION() 字符串至少应提供 OS 的名称。从中您知道调用什么程序来获取更多信息。

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() 字符串中得到 OS,你就会知道如何在 Windows 中加载有用的函数,如 LoadLibraryGetProcAddress。然后你创建参数,如果你有 OS 的权利 OS 和你想要的存根过程的名称,如果没有。

   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 认为使用命名常量而不是绑定名称的字符文字是有效的。

但原则上你可以使用编译器告诉你 OS 名称并设置一些关键函数你需要为其余的东西请求 OS,但它需要比我拥有的更高级的编译器。如果你有一个更好的编译器,我可以编辑更多的东西,你可以看看它是否在你这边崩溃了。

按照问题中显示的方式完成第 1 点后,您可以继续其他点。

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

uname -a

获取OS名称和版本信息,如

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 以找出 OS 版本。

就我而言,它包括:

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。您的问题非常(太?)广泛,所以我认为只回答其中的一部分是可以接受的。

我在 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 命令。 (不同操作系统的系统命令明显不同。)