在bash重定向中,我问question并得到如下答案。
使用
cat < file
,cat
从其标准输入读取; shell打开文件并将文件句柄连接到cat
现在,我很好奇这是怎么回事。我的意思是,程序(由C或C ++实现)如何获取文件句柄作为参数。我知道只有字符(例如char* argc[]
)可以作为参数。
答案 0 :(得分:2)
它并没有真正将它作为参数(至少不是命令行参数)。
当进程启动时(在类UNIX系统上),它打开了三个标准流:标准输入,标准输出和标准错误。如果您没有重定向任何内容,标准输入将来自键盘,标准输出和标准错误都将进入屏幕(通过某些设备连接,例如/dev
)。
当您重定向标准流(输入,输出或错误)时,shell会打开该文件的句柄,然后执行必要的操作以将其设置为子项的指定标准流 - 例如,在系统上使用fork
,它可以使用dup2
为指定的文件设置自己的标准句柄,然后分叉子进程,然后(在父进程中)恢复其标准流(这是&#39; s不是处理它的唯一可行方法,只是一种可能性。)
答案 1 :(得分:1)
<
和file
不是参数。
<
(同样>
,>>
和|
是重定向符号,其行为直接嵌入{{1} (以及其他炮弹)。
重定向意味着代替标准输入/输出(键盘和监视器),程序可以读取/写入文件 (bash
,<
和>
),或 - 在>>
的情况下 - 左侧程序的输出作为输入传递给正确的程序。
(假设相应的程序 - 在你的情况下为|
- 被编程为从标准输入/输出读/写。对于程序员来说这是一个非常方便的方式,因为他/她不需要关心文件及其处理程序。)
答案 2 :(得分:1)
<
字符表示输入流已从stdin
重定向到file
。程序不会将文件句柄作为参数,但stdin
句柄会被命令行中提供的句柄file
替换。请参阅Redirection on Wikipedia