使用除cat之外的命令重定向

时间:2015-03-10 10:39:26

标签: c shell unix

我正在开发一个个人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

你们有什么想法我能做到吗? 如果您需要任何精确度,请告诉我,

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

I / O重定向的工作方式

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

请参阅GNU C Library: Duplicating DescriptorsGNU C Library: Launching jobs

您可能需要的其他工具

您不应该使用strncmp(command, "cat", 3)检查命令是否为cat,因为这也将匹配catman或catdvi,但不适用于"猫&#34 ;.而是使用标记器,例如strtok

请参阅The Gnu C Library: Finding Tokens in a String