【问题标题】:Redirections with commands other then cat使用 cat 以外的命令进行重定向
【发布时间】:2015-03-10 10:39:26
【问题描述】:

我正在开发个人 shell 并开始实现重定向。

'' 仅适用于 cat 命令。

这里是处理'>'效果的代码:

int     write_in_file(char **tab, int fd)
{
  int   count;
  char   i;

  if (strncmp("cat", tab[0], 3) == 0)
    {
      while ((count = read(0, &i, 1)) > 0)
        write(fd, &i, 1);
      exit(1);
    }
  else if (strncmp("ls", tab[0], 2) == 0)
    {
      /* Here handle other commands then cat */
    }
  else
    return (0);
}

如你所见,当shell识别时

cat > file

它做了它应该做的事情:让用户写入所述文件。 但现在我希望处理其他命令,例如

ls > file
man ascii > file

你们知道我该怎么做吗? 如果您需要任何精度,请告诉我,

编辑:请注意,我在此函数中处于子进程中。

提前致谢。

【问题讨论】:

  • 当您的代码“运行良好”时,您为什么要exit(1)?退出状态为 1 表示失败。
  • Man forkexec 或 google fork/exec
  • 你说得对,我马上改。
  • 顺便说一下,当我在这个函数中时,我在子进程中。
  • 你为什么要尝试实现cat? (您没有按照pubs.opengroup.org/onlinepubs/9699919799/utilities/… 的要求正确实施-u)。而不是实现该工具,您应该简单地exec。您需要做的是将适当的文件描述符复制到重定向路径并调用exec

标签: c shell unix


【解决方案1】:

I/O 重定向的工作原理

当 shell 调用 exec(启动例如 cat 或 man)时,程序将继承之前设置的所有文件句柄。该程序将使用 0 作为标准输入,1 作为标准输出,2 作为标准错误。如果您想将输出重定向到文件,您将打开输出文件并使用dup2 将其设置为文件编号 1。通常所有这些都在fork 之后完成。

GNU C Library: Duplicating DescriptorsGNU C Library: Launching jobs

您可能需要的其他工具

您不应该使用strncmp(command, "cat", 3) 来检查命令是否为cat,因为这也将匹配catman 或catdvi,但不匹配“cat”。而是使用标记器,例如strtok.

The Gnu C Library: Finding Tokens in a String

【讨论】:

  • 你答案的第一部分很好。第二部分没有那么多,因为 OP 根本不应该检查命令名称。
  • @JohnKugelman 你是对的,此时shell 不应该关心命令名称,但在某些时候shell 必须解析命令行并识别内置命令。从头开始编写自己的 shell 时,将 cat 实现为内置可能不是您要做的第一件事,但是 shell 确实具有内置命令(例如 echo、test、true、cd、help)并且可能会这样做原因。
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 2021-11-09
  • 2020-02-01
  • 2018-09-05
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多