在bash重定向中,我问了一个question并得到了如下答案。获取文件句柄作为参数
与
cat < file
,cat
读取其标准输入;壳打开文件并连接文件句柄cat
现在,我很好奇这是如何可能的。我的意思是,一个程序(用C或C++实现的)如何获得一个文件句柄作为参数。我知道只有字符(例如char* argc[]
)可以作为参数。
在bash重定向中,我问了一个question并得到了如下答案。获取文件句柄作为参数
与
cat < file
,cat
读取其标准输入;壳打开文件并连接文件句柄cat
现在,我很好奇这是如何可能的。我的意思是,一个程序(用C或C++实现的)如何获得一个文件句柄作为参数。我知道只有字符(例如char* argc[]
)可以作为参数。
<
and file
are not arguments。
<
(以及类似地>
,>>
,和|
是重定向符号和它们的行为在bash
(和另一个外壳直接嵌入,太)。
的重定向意味着代替标准输入/输出(键盘和监视器)程序从/向文件(<
,>
和>>
)读取/写入,或者 - 在|
- 左程序的输出作为输入传递给正确的程序。
(其设定对应的程序 - 在你的情况cat
- 被编程为读/从标准输入/输出写入对于一个程序员来说这是因为他/她不必与文件有关一个非常方便的方式。和它们的处理程序)。
<
字符表示输入流从stdin
重定向到file
。该程序不会将文件句柄作为参数获取,但stdin
句柄被替换为在命令行中提供的句柄file
。看到描述Redirection on Wikipedia
它并没有真正把它作为参数(至少不是一个命令行参数)。
当进程启动时(在类UNIX系统上),它有三个打开的标准流:标准输入,标准输出和标准错误。如果你没有重定向任何东西,标准输入将来自键盘,并且标准输出和标准错误都将进入屏幕(通过某些设备连接,例如/dev
)。
当您重定向标准流(输入,输出或错误)时,shell会打开该文件的句柄,然后执行必要的操作,将其设置为子对象的指定标准流 - 例如,在系统使用fork
,它可以使用dup2
为指定文件设置自己的标准句柄,然后fork子进程,然后(在父进程中)恢复其标准流(这不是处理它的唯一可能方式,只有一个可能性)。
它不通过命令行参数执行此操作。它改变了'stdin'在你的进程运行时得到它的输入。 – paddy
http://en.cppreference.com/w/cpp/io/c –