Как получить имя файла, действующего как stdin / stdout?

#io #fortran #stdout #stdin #fortran90

#io #fortran #стандартный вывод #stdin #fortran90

Вопрос:

У меня следующая проблема. Я хочу написать программу на Fortran90, которую я хочу иметь возможность вызывать следующим образом:

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

В дополнение к «main.out» (чье имя я могу задать при вызове программы), должны быть записаны вторичные выходные данные, и я хотел, чтобы у них было имя, похожее на «main.in » или «main.out» (на самом деле они не называются «main»); однако, когда я использую:

 INQUIRE(UNIT=5,NAME=sInputName)
  

Содержимое sInputName становится «Stdin» вместо имени файла. Есть ли какой-либо способ получить имя файлов, которые связаны с stdin / stdout при вызове программы??

Ответ №1:

К сожалению, смысл перенаправления ввода-вывода заключается в том, что вашей программе не обязательно знать, что это за файлы ввода-вывода. В системах на базе unix вы не можете просматривать аргументы командной строки, поскольку < main.in > main.out фактически обрабатываются командной оболочкой, которая использует эти файлы для настройки стандартного ввода-вывода перед вызовом вашей программы.

Вы должны помнить, что иногда стандартный ввод и вывод даже не будут файлами, поскольку они могут быть терминалом или каналом. например

 ./generate_input | ./program.x | less
  

Итак, одним из решений является перепроектирование вашей программы таким образом, чтобы выходной файл был явным аргументом.

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

Таким образом, ваша программа узнает имя файла. Стоимость заключается в том, что ваша программа теперь отвечает за открытие (и, возможно, создание) файла.

Тем не менее, в системах Linux вы действительно можете найти yout, на который указывают ваши стандартные дескрипторы файлов из специальной файловой системы / 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, поэтому это может быть не настолько переносимым. Скорее диагностический инструмент.

Комментарии:

1. 1; Я думаю, если вам нужен такой уровень контроля, то лучше всего передать входное имя программе и заставить программу открыть файл и сгенерировать имена выходных файлов.

Ответ №2:

Возможно, встроенные подпрограммы get_command и / или get_command_argument могут помочь. Они были введены в fortran 2003 и либо возвращают полную командную строку, которая использовалась для вызова программы, либо указанный аргумент.