具有文件输入的 exec 系列
大家好,我正在尝试用 C++ 编写一个 shell,但在使用 exec 命令使用输入文件的功能方面遇到了问题。例如,Linux 中的 bc shell 能够执行“bc < text.txt”,它像时尚一样批量计算文本中的行。我正在尝试用我的外壳做同样的事情。大致如下:
char* input = “input.txt”;
execlp(input, bc, …..) // I don’t really know how to call the execlp command and all the doc and search have been kind of cryptic for someone just starting out.
使用 exec 命令是否可以做到这一点?或者我是否必须逐行读取并在 for 循环中运行 exec 命令?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以打开文件,然后将文件描述符
dup2()
发送到标准输入,或者您可以关闭标准输入,然后打开文件(这是有效的,因为标准输入是描述符0并且open( )
返回编号最小的可用描述符)。您可能需要比
throw
更聪明的错误处理,尤其是因为这是子进程,而需要知道的是父进程。但是抛出
站点标记了处理错误的点。请注意
close()
。You can open the file and then
dup2()
the file descriptor to standard input, or you can close standard input and then open the file (which works because standard input is descriptor 0 andopen()
returns the lowest numbered available descriptor).You would probably want cleverer error handling than the
throw
, not least because this is the child process and it is the parent that needs to know. But thethrow
sites mark points where errors are handled.Note the
close()
.重定向由 shell 执行——它不是 bc 的参数。您可以调用 bash(相当于
bash -c "bc),
例如,您可以使用
execvp
以及文件参数" bash"
和参数列表the redirect is being performed by the shell -- it's not an argument to
bc
. You can invoke bash (the equivalent ofbash -c "bc < text.txt"
)For example, you can use
execvp
with a file argument of"bash"
and argument list