我对通过Fortran获取系统信息感兴趣--类别可能包括:
据我理解,您可以通过预处理指令获取基本OS信息,例如
#ifdef _WIN32
print *,'Windows'
#ifdef _APPLE_
print *,'macOS'
#ifdef __linux
print *,'Linux'
#endif
这是第1类的有效解决方案,但仍然是2-4。
谢谢!
发布于 2018-03-07 12:48:35
一旦你按照你在问题中所显示的方式完成了第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文件(只需重定向stdout)。
在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
...
我对微软的Windows一无所知。你的问题也很(?)所以我认为只回答一部分是可以接受的。
发布于 2018-03-06 23:58:53
你可以在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中加载有用的函数,如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
这样,您可以访问LoadLibrary
,如果您在Windows中,而不是造成一个不满意的外部引用,如果不是。不幸的是,gfortran并不认为为绑定名称使用命名常量而不是字符文字是有效的。
但原则上,您可以使用编译器告诉您OS的名称,并设置一些关键的函数,您需要为其余的东西请求操作系统,但它需要一个比我更高级的编译器。如果你有一个更好的编译器,我可以编辑更多的东西,你可以看到它是否在你的末端崩溃。
发布于 2018-03-07 19:39:40
我给出了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
我使用help from来获得体系结构。通常,子例程call system(String_variable)
启动cmd行并获取系统命令。类似地,它在Ubuntu中启动终端并获取shell命令。(对于不同的操作系统,系统命令明显不同。)
https://stackoverflow.com/questions/49141093
复制相似问题