如何获取充当stdin/stdout的文件名?

2024-10-02 12:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题。我想用Fortran90编写一个程序,我希望能够这样调用:

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

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

INQUIRE(UNIT=5,NAME=sInputName)

sInputName的内容变为“Stdin”,而不是文件名。在调用程序时,是否有方法获取链接到stdin/stdout的文件名


Tags: 方法namein程序名称内容main文件名
2条回答

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

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

./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,但检查输出文件的psudeo代码方法可以是:

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

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

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

相关问题 更多 >

    热门问题