使用 Fortran 获取系统信息
Get system information with Fortran
我有兴趣通过 Fortran 获取系统信息 - 类别可能包括:
- 操作系统名称
- 操作系统版本
- CPU 体系结构(32/64 位)
- 核心数
据我了解,您可以通过预处理指令获取基本的 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 中加载有用的函数,如 LoadLibrary
和 GetProcAddress
。然后你创建参数,如果你有 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 命令。 (不同操作系统的系统命令明显不同。)
我有兴趣通过 Fortran 获取系统信息 - 类别可能包括:
- 操作系统名称
- 操作系统版本
- CPU 体系结构(32/64 位)
- 核心数
据我了解,您可以通过预处理指令获取基本的 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 中加载有用的函数,如 LoadLibrary
和 GetProcAddress
。然后你创建参数,如果你有 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 命令。 (不同操作系统的系统命令明显不同。)