【问题标题】:simple shell program unix file redirection for non built-in commands非内置命令的简单 shell 程序 unix 文件重定向
【发布时间】:2011-06-20 10:35:17
【问题描述】:

我正在尝试编写一个简单的 shell 程序,但遇到了非内置命令的文件重定向问题。例如 ./a.out outfile,会让用户编译的程序 a.out 从 infile 获取输入并将其输出输出到 outfile 而不是它通常使用的流。当我遇到非内置命令时,我会创建一个新进程并使用提供的参数覆盖一个新图像。一般格式是命令 arg1 arg2 ... argn outfile。因此 args(arg1 到 argn)将在新图像中传递,输入和输出将更改为 infile 和 outfile 这是我的分叉过程的 sn-p。

pid = fork();

if (pid < 0) {
   fprintf(stderr, "*** fork error ***\n");
} else if (pid == 0) {
   execvp(command, args);
}

waitpid(pid, &status, 0);

是否有一个 unix 命令可以让我这样做?我还在想可能有一种方法可以更改新图像中的标准输入和标准输出?任何链接或信息将不胜感激。

【问题讨论】:

  • "fork error" 不是有用的消息。请使用 perror()。

标签: c linux shell unix redirect


【解决方案1】:

在 Unix 上,您通常需要dup2。有关复制文件描述符,请参阅 libc docs

【讨论】:

    【解决方案2】:

    在分叉进程中,就在exec-ing 新图像之前,关闭文件句柄 0 (stdin)、1 (stdout) 和可能的 2 (stderr)。

    然后使用open() 以正确的顺序(stdin、out 和 err)打开必要的文件。他们将各自使用文件句柄表中的第一个条目 - 0、1 和 2。因此,从现在开始,您打开的第一个文件将被视为 stdin

    【讨论】:

      猜你喜欢
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2012-08-08
      相关资源
      最近更新 更多