2011-04-09 151 views
3

我遇到以下问题。我想写在FORTRAN90一个程序,我希望能够像这样调用:如何获取作为标准输入/标准输出的文件的名称?

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

此外,以“main.out”(他的名字在调用程序时我可以设置),次级输出必须书面,我希望他们有一个类似的名字“main.in”或“main.out”(他们实际上不称为“主”);但是,当我使用:

INQUIRE(UNIT=5,NAME=sInputName) 

sInputName的内容变成“标准输入”而不是文件的名称。有什么方法可以获得当程序被调用时链接到stdin/stdout的文件名?

回答

6

不幸的是,I/O重定向的重点在于你的程序不必知道输入/输出文件是什么。在基于unix的系统上,您不能查看命令行参数,因为<main.in> main.out实际上由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,但检查输出文件的psudeo编码方式可以是:

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

记住我之前说过,没有这样做,这实际上是一个正常的文件。它可能是一个终端设备,一个管道,一个网络套接字,无论如何...另外,我不知道除了redhat/centos linux以外还有哪些操作系统可以工作,所以它可能不是那么便携。更多的诊断工具。

+3

+1;我想如果你想要这个级别的控制权,将输入名称传递给程序并让程序打开文件并生成输出文件名是要走的路。 – 2011-04-09 14:39:20

0

也许内在的子程序get_command和/或get_command_argument可以有所帮助。它们在2003年的fortran中引入,并返回用于调用该程序的完整命令行或指定的参数。

相关问题