Fortran 中系统范围的唯一文件名
System-wide unique filename in fortran
我有一个 Fortran 程序需要找到不区分大小写匹配的文件名 'my_file'
为此,我使用以下命令:
call system "find -ipath '*my_file' > " // trim(tmp_name)
之后我阅读了tmp_name
的内容
当 运行 连接程序的多个实例时,它们会失败,因为所有实例都写入同一个文件。
我使用以下解决方案都没有成功:
- 从系统获取输出而不保存到文件
- 向文件名添加随机数(不起作用,因为随机数在同时启动的实例之间不是唯一的,即使使用
CALL RANDOM_INIT (REPEATABLE=.FALSE., IMAGE_DISTINCT=.TRUE.)
)
- 打开临时文件,然后使用该文件的名称(不起作用,因为临时文件未命名)
- 运行 在
!$omp critical(critical_generate_temp_name)
块内
有什么想法吗?
当然可以在文件名中包含PID(进程ID)。 Intel Fortran 和其他一些编译器在其他编译器中有 GETPID()
function from the IFPORT
module (can be also a non-standard intrinsic),但您也可以改用 GET_ENVIRONMENT_VARIABLE()
并查询 PID
环境变量值(可以附加到的字符串你的文件名)。
PID 在任何给定时间都应该是唯一的,但在原始进程终止后将来会重复。 (PID reuse possibility in Linux)
您还可以包括日期和时间。
这是一个快速但肮脏的实用解决方案,可以快速完成在某些多用户(或已经受到威胁的)系统中可能不安全的工作。欢迎使用其他方法的其他答案。
我有一个 Fortran 程序需要找到不区分大小写匹配的文件名 'my_file'
为此,我使用以下命令:
call system "find -ipath '*my_file' > " // trim(tmp_name)
之后我阅读了tmp_name
的内容当 运行 连接程序的多个实例时,它们会失败,因为所有实例都写入同一个文件。
我使用以下解决方案都没有成功:
- 从系统获取输出而不保存到文件
- 向文件名添加随机数(不起作用,因为随机数在同时启动的实例之间不是唯一的,即使使用
CALL RANDOM_INIT (REPEATABLE=.FALSE., IMAGE_DISTINCT=.TRUE.)
) - 打开临时文件,然后使用该文件的名称(不起作用,因为临时文件未命名)
- 运行 在
!$omp critical(critical_generate_temp_name)
块内
有什么想法吗?
当然可以在文件名中包含PID(进程ID)。 Intel Fortran 和其他一些编译器在其他编译器中有 GETPID()
function from the IFPORT
module (can be also a non-standard intrinsic),但您也可以改用 GET_ENVIRONMENT_VARIABLE()
并查询 PID
环境变量值(可以附加到的字符串你的文件名)。
PID 在任何给定时间都应该是唯一的,但在原始进程终止后将来会重复。 (PID reuse possibility in Linux)
您还可以包括日期和时间。
这是一个快速但肮脏的实用解决方案,可以快速完成在某些多用户(或已经受到威胁的)系统中可能不安全的工作。欢迎使用其他方法的其他答案。