【发布时间】:2013-12-07 20:40:21
【问题描述】:
您好,我正在尝试用 c 构建一个 shell,但我遇到了 i/o 重定向部分。我必须支持多个重定向,例如“333sh:myprog out_file” myprog 从 in_file 获取输入,结果将被重定向到 out_file 等等。你能给我一个起点吗?谢谢
【问题讨论】:
您好,我正在尝试用 c 构建一个 shell,但我遇到了 i/o 重定向部分。我必须支持多个重定向,例如“333sh:myprog out_file” myprog 从 in_file 获取输入,结果将被重定向到 out_file 等等。你能给我一个起点吗?谢谢
【问题讨论】:
因此,您正在编写的外壳程序负责启动进程myprog 并以某种方式强制它从in_file 读取其输入并将其输出写入out_file。
您要做的第一件事是解析输入。这意味着在您的程序中以某种方式表示您要启动的进程的名称、要读取的文件名以及要写入的文件名。这样做基本上需要对字符串 myprog < in_file > out_file 进行标记,然后提出一些表示(如结构)来做什么。
如何真正实现重定向非常简单。要启动这个过程,我猜你要去fork(),然后是execvp。要实现的是文件描述符跨叉复制并跨 execvps 持续存在。
所以基本上在shell中,您使用dup(2)调用将STDIN_FILENO替换为input_file的文件描述符,并将STDOUT_FILENO替换为output_file的文件描述符。然后fork,然后execvp。在分叉之后,在父进程(shell)中,您需要将 STDOUT 和 STDIN 文件描述符恢复到分叉之前的状态,因此您需要以某种方式记住该信息。
【讨论】:
无论您在哪里使用 printf 和 scanf(或其他与 stdin/stdout 一起使用的函数),都将它们替换为接收文件名参数 (fprintf/fscanf) 的函数,并在该文件参数中放置打开后的 io 重定向文件.
【讨论】: