2017-04-26 108 views
1

在bash重定向中,我问了一个question并得到了如下答案。获取文件句柄作为参数

cat < file,cat读取其标准输入;壳打开文件并连接文件句柄cat

现在,我很好奇这是如何可能的。我的意思是,一个程序(用C或C++实现的)如何获得一个文件句柄作为参数。我知道只有字符(例如char* argc[])可以作为参数。

+0

它不通过命令行参数执行此操作。它改变了'stdin'在你的进程运行时得到它的输入。 – paddy

+0

http://en.cppreference.com/w/cpp/io/c –

回答

1

< and file are not arguments。

<(以及类似地>>>,和|重定向符号和它们的行为在bash(和另一个外壳直接嵌入,太)。

重定向意味着代替标准输入/输出(键盘和监视器)程序从/向文件<,>>>)读取/写入,或者 - 在| - 左程序的输出作为输入传递给正确的程序。

(其设定对应的程序 - 在你的情况cat - 被编程为读/从标准输入/输出写入对于一个程序员来说这是因为他/她不必与文件有关一个非常方便的方式。和它们的处理程序)。

1

<字符表示输入流从stdin重定向到file。该程序不会将文件句柄作为参数获取,但stdin句柄被替换为在命令行中提供的句柄file。看到描述Redirection on Wikipedia

2

它并没有真正把它作为参数(至少不是一个命令行参数)。

当进程启动时(在类UNIX系统上),它有三个打开的​​标准流:标准输入,标准输出和标准错误。如果你没有重定向任何东西,标准输入将来自键盘,并且标准输出和标准错误都将进入屏幕(通过某些设备连接,例如/dev)。

当您重定向标准流(输入,输出或错误)时,shell会打开该文件的句柄,然后执行必要的操作,将其设置为子对象的指定标准流 - 例如,在系统使用fork,它可以使用dup2为指定文件设置自己的标准句柄,然后fork子进程,然后(在父进程中)恢复其标准流(这不是处理它的唯一可能方式,只有一个可能性)。