将输出重定向到 C 中的文件
我用 C 语言编写了一个基本 shell 来执行基本命令,它将执行命令 ls
、ls -al
、ls -al |更多
等
我想在我的 shell 中执行以下命令。 喜欢 ;
ls -al > a.txt
这将为我提供一个 a.txt
文件,其中包含 ls -al
进程的输出。
我找到了一个解决方案,它正在更改 shell 中的命令,例如 [command1] | tee [文件名]
。在这种情况下,它将更改 ls -al > a.txt
到 ls -al | tee a.txt
。但这个过程也将输出提供给文件和终端。如何停止在终端中打印输出。
或者有没有比使用 tee 命令更好的解决方案。 提前致谢...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是我用 dup2 测试的结果
更微妙的一点是在正确的时间记住 fflush :) 否则,你会得到非常令人惊讶的结果。
另外,更喜欢
fileno
而不是硬编码1
(stdout)2
(stderr)。重定向
stdin
留给读者作为练习This is the result of my testing things out with dup2
The more subtle point is remembering fflush at the right times :) Otherwise, you'll get very surprising results.
Also, prefer
fileno
instead of hardcoding1
(stdout)2
(stderr).Redirecting
stdin
was left as an exercise for the reader当输出要发送到文件时,不要使用管道。
当您分叉子进程来运行 ls 命令时,您会记下重定向并打开文件;然后使用 dup2()(或 close() 和 dup()),以便文件描述符现在成为子级的标准输出;您关闭重复的文件描述符 - 由
open()
返回的文件描述符;然后你照常执行ls
;它的标准输出现在被发送到文件。请注意,非管道 I/O 重定向是在分叉之后而不是之前执行的。必须在分叉之前设置管道,但其他 I/O 重定向则不需要。
Don't use pipe when the output is to go to a file.
When you fork the child to run the
ls
command, you note the redirection, and open the file; you then usedup2()
(orclose()
anddup()
) so that the file descriptor is now standard output for the child; you close the duplicated file descriptor - the one returned byopen()
; then you executels
as usual; its standard output is now sent to the file.Note that you do the non-pipe I/O redirection after forking, not before. Pipes have to be set up before forking, but other I/O redirection does not.
在新创建的进程中调用 execve(2) 来执行命令之前,您可以通过
dup2(2)
系统调用:当然,你需要有一些错误处理。
Before you call
execve(2)
in the newly created process to execute the command, you can redirect its standard input or output via thedup2(2)
system call:Of course, you need to have some error handling.