【问题标题】:How to get the name of a file acting as stdin/stdout?如何获取充当标准输入/标准输出的文件的名称?
【发布时间】:2011-08-01 22:33:09
【问题描述】:

我遇到以下问题。我想在 Fortran90 中编写一个程序,我希望能够像这样调用它:

./program.x < main.in > main.out

除了“main.out”(我可以在调用程序时设置其名称)之外,必须编写辅助输出并且我希望它们具有与“main.in”或“main.out”相似的名称(它们实际上并不称为“主要”);但是,当我使用时:

INQUIRE(UNIT=5,NAME=sInputName)

sInputName 的内容变为“Stdin”而不是文件名。调用程序时有什么方法可以获取链接到stdin/stdout的文件名吗??

【问题讨论】:

    标签: io fortran stdout stdin fortran90


    【解决方案1】:

    不幸的是,i/o 重定向的重点是您的程序不必知道输入/输出文件是什么。在基于 unix 的系统上,您无法查看命令行参数,因为 &lt; main.in &gt; main.out 实际上是由 shell 处理的,shell 在调用程序之前使用这些文件设置标准输入和输出。

    您必须记住,有时标准输入和输出甚至不是文件,因为它们可能是终端或管道。例如

    ./generate_input | ./program.x | less
    

    因此一种解决方案是重新设计您的程序,以便输出文件是一个显式参数。

    ./program.x --out=main.out
    

    这样你的程序就知道文件名了。代价是您的程序现在负责打开(也可能是创建)文件。

    也就是说,在 linux 系统上,您实际上可以从特殊的 /proc 文件系统中找到标准文件句柄指向的位置。每个文件描述符都会有符号链接

    /proc/<process_id>/fd/0 -> standard_input
    /proc/<process_id>/fd/1 -> standard_output
    /proc/<process_id>/fd/2 -> standard_error
    

    抱歉,我不知道 fortran,但检查输出文件的伪代码方式可能是:

    out_name = realLink( "/proc/"+getpid()+"/fd/1" )
    if( isNormalFile( out_name ) )
        ...
    

    请记住我之前所说的,没有 garauntee 这实际上是一个普通文件。它可能是一个终端设备、一个管道、一个网络套接字,等等......另外,我不知道除了 redhat/centos linux 之外还有什么其他操作系统,所以它可能不是那么便携。更多的诊断工具。

    【讨论】:

    • +1;我认为如果您想要那种级别的控制,将输入名称传递给程序并让程序打开文件并生成输出文件名是要走的路。
    【解决方案2】:

    也许内部子程序get_command 和/或get_command_argument 可以提供帮助。它们是在 fortran 2003 中引入的,要么返回用于调用程序的完整命令行,要么返回指定的参数。

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多