Как получить имя входного файла из терминала Unix в C? - PullRequest
0 голосов
/ 02 декабря 2011

Моя программа выполняется как:

$./sort 1 < test.txt

sort - название программы

1 - аргумент (argv [1])

и test.txt - это файл, который я ввожу с

Можно ли извлечь файл имени из этого? если так как? Проблема в том, что я уже написал всю свою программу так, как будто я мог извлечь имя из строки ввода, поэтому я должен иметь возможность передавать его в аргументы.

Любая помощь приветствуется, Спасибо!

Ответы [ 4 ]

3 голосов
/ 02 декабря 2011

Вы не можете.Оболочка открывает (open(2)) этот файл и устанавливает перенаправление (скорее всего, с использованием dup2).

Единственный возможный способ состоит в том, чтобы оболочка явно экспортировала информацию в переменную среды, которую вы могли прочитатьчерез getenv.

Но это не всегда имеет смысл.Например, какое имя файла вы ожидаете от

$ echo "This is the end" | ./sort 1
2 голосов
/ 02 декабря 2011

Хотя это нельзя сделать мобильно, в Linux это возможно, вызвав readlink на /proc/self/fd/0 (или /proc/some_pid/fd/0).

например, запустив:

echo $(readlink /proc/self/fd/0 < /dev/null)

выходы:

/dev/null
0 голосов
/ 02 декабря 2011

Если вы запустили Solaris, вы можете проанализировать вывод pfiles, чтобы получить файл, связанный, если таковой имеется, со stdin.

$ /usr/bin/sleep 3600 < /tmp/foo &
[1] 8430
$ pfiles 8430
8430: /usr/bin/sleep 3600
  Current rlimit: 65536 file descriptors
   0: S_IFREG mode:0600 dev:299,2 ino:36867886 uid:12345 gid:67890 size=123
      O_RDONLY|O_LARGEFILE
      /tmp/foo
   1: S_IFCHR mode:0600 dev:295,0 ino:12569206 uid:12345 gid:67890 rdev:24,2
...

На большинстве платформ Unix вы также получите ту же информацию от lsof -p, если установлена ​​эта бесплатная программа.

0 голосов
/ 02 декабря 2011

Нет, вы не можете: оболочка отправляет содержимое test.txt на стандартный ввод вашей программы.

Посмотрите на это:

    sort << _EOF
3
1
2
_EOF

<> |операторы обрабатываются оболочкой, они изменяют стандартный ввод, вывод, ошибку программ в строке cmd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...