如何从C语言的Unix终端获取输入文件名?

时间:2011-12-02 07:24:07

标签: c file unix input terminal

我的程序执行如下:

$./sort 1 < test.txt

sort是程序名称

1是参数(argv [1])

和test.txt是我从

输入的文件

是否可以从中提取名称文件?如果是这样的话? 问题是我已经编写了整个程序,好像我可以从输入行中提取名称,所以我需要能够将它传递给参数。

感谢任何帮助, 谢谢!

4 个答案:

答案 0 :(得分:3)

你做不到。 shell打开(open(2))该文件并设置重定向(最有可能使用dup2)。

唯一可行的方法是让shell在您可以通过getenv读取的环境变量中显式导出信息。

但它并不总是有意义的。例如,您希望从哪个文件名

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

答案 1 :(得分:2)

虽然这不能轻松完成,但可以通过/proc/self/fd/0(或/proc/some_pid/fd/0)上的readlink来调用Linux。

例如,跑步:

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

输出:

/dev/null

答案 2 :(得分:0)

不,你不能:shell将test.txt的内容发送到你程序的标准输入。

看看这个:

    sort << _EOF
3
1
2
_EOF

&lt; &GT; |运算符由shell处理,它们改变cmd行中程序的标准输入,输出和错误。

答案 3 :(得分:0)

如果您碰巧运行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获取相同的信息。