【问题标题】:Shell I/O redirection外壳 I/O 重定向
【发布时间】:2013-12-07 20:40:21
【问题描述】:

您好,我正在尝试用 c 构建一个 shell,但我遇到了 i/o 重定向部分。我必须支持多个重定向,例如“333sh:myprog out_file” myprog 从 in_file 获取输入,结果将被重定向到 out_file 等等。你能给我一个起点吗?谢谢

【问题讨论】:

    标签: c linux shell redirect io


    【解决方案1】:

    因此,您正在编写的外壳程序负责启动进程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 文件描述符恢复到分叉之前的状态,因此您需要以某种方式记住该信息。

    【讨论】:

      【解决方案2】:

      无论您在哪里使用 printf 和 scanf(或其他与 stdin/stdout 一起使用的函数),都将它们替换为接收文件名参数 (fprintf/fscanf) 的函数,并在该文件参数中放置打开后的 io 重定向文件.

      【讨论】:

        猜你喜欢
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 2010-10-22
        相关资源
        最近更新 更多