首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Fortran获取系统信息

使用Fortran获取系统信息
EN

Stack Overflow用户
提问于 2018-03-06 22:31:03
回答 3查看 1.4K关注 0票数 3

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

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

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

代码语言:javascript
运行
复制
#ifdef _WIN32
  print *,'Windows'
#ifdef _APPLE_
  print *,'macOS'
#ifdef __linux
  print *,'Linux'
#endif

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

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-07 12:48:35

一旦你按照你在问题中所显示的方式完成了第1点,你就可以继续做其他的事情了。

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

代码语言:javascript
运行
复制
uname -a

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

代码语言:javascript
运行
复制
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来查找操作系统版本。

就我而言,它包括:

代码语言:javascript
运行
复制
NAME="openSUSE Leap"
VERSION="42.2"
ID=opensuse
...

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

在我的例子中,它包含:

代码语言:javascript
运行
复制
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一无所知。你的问题也很(?)所以我认为只回答一部分是可以接受的。

票数 2
EN

Stack Overflow用户

发布于 2018-03-06 23:58:53

你可以在Fortran做所有的事情,除非不是真的。来自COMPILER_VERSION()模块的ISO_FORTRAN_ENV字符串至少应该提供操作系统的名称。从中您知道要调用什么过程来获取更多的信息。

代码语言:javascript
运行
复制
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的输出:

代码语言:javascript
运行
复制
This is a 64-bit system.
GCC version 7.2.0

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

代码语言:javascript
运行
复制
   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的名称,并设置一些关键的函数,您需要为其余的东西请求操作系统,但它需要一个比我更高级的编译器。如果你有一个更好的编译器,我可以编辑更多的东西,你可以看到它是否在你的末端崩溃。

票数 3
EN

Stack Overflow用户

发布于 2018-03-07 19:39:40

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

代码语言:javascript
运行
复制
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命令。(对于不同的操作系统,系统命令明显不同。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49141093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档