不幸的是,I/O 重定向的要点是您的程序不必知道输入/输出文件是什么。在基于 UNIX 的系统上,您不能将命令行参数视为< main.in > 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 ) )
...
请记住我之前所说的,不能保证这实际上是一个普通文件。它可以是一个终端设备,一个管道,一个网络套接字,等等......另外,我不知道除了 redhat/centos linux 之外,它还可以在哪些其他操作系统上运行,所以它可能不那么便携。更多的是一种诊断工具。