简体   繁体   中英

How to get input file name from Unix terminal in C?

My program gets executed like:

$./sort 1 < test.txt

sort is the program name

1 is the argument (argv[1])

and test.txt is the file I am inputting from

Is it possible to extract the name file from this? if so how? The problem is I already wrote my whole program as if I could extract the name from the input line, so I need to be able to pass it into arguments.

Any help is appreciated, Thanks!

You can't. The shell opens ( open(2) ) that file and sets up the redirect (most likely using dup2).

The only possible way would be for the shell to explicitly export the information in an environment variable that you could read via getenv .

But it doesn't always make sense. For example, what file name would you expect from

$ echo "This is the end" | ./sort 1

Though this can't be done portably, it's possible on Linux by calling readlink on /proc/self/fd/0 (or /proc/some_pid/fd/0 ).

eg, running:

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

outputs:

/dev/null

No you can't: the shell sends the content of test.txt to the standard input of your program.

Look at this:

    sort << _EOF
3
1
2
_EOF

The < > | operators are processed by the shell, they alter standard input,output,error of the programs in the cmd line.

If you happen to run Solaris, you could parse pfiles output to get the file associated, if any, with 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
...

On most Unix platforms, you will also get the same information from lsof -p if this freeware is installed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM