Как получить имя файла, выполняющего функцию stdin / stdout? - PullRequest
3 голосов
/ 09 апреля 2011

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

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

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

INQUIRE(UNIT=5,NAME=sInputName)

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

Ответы [ 2 ]

6 голосов
/ 09 апреля 2011

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

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

./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, поэтому он может быть не таким переносимым. Больше диагностического инструмента.

0 голосов
/ 09 апреля 2011

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

...