如何在新创建的c shell中输入/输出重定向?

时间:2015-02-04 21:39:32

标签: c linux shell io io-redirection

我想知道是否有人能指出我如何做到这一点的正确方向?例如,如果我写" ls> contents.txt",我希望将ls的输出写入content.txt。

这是我到目前为止所做的。

 #include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <ctype.h>

void  parse(char *line, char **argv)
{
     while (*line != '\0') { 
          while (*line == ' ' || *line == '\t' || *line == '\n')
               *line++ = '\0';     
          *argv++ = line;          
          while (*line != '\0' && *line != ' ' && 
                 *line != '\t' && *line != '\n') 
               line++;            
     }
     *argv = '\0';               
}

void  execute(char **argv)
{
     pid_t  pid;
     int    status;

     if ((pid = fork()) < 0) {     
          printf("*** ERROR: forking child process failed\n");
          exit(1);
     }
     else if (pid == 0) {          
          if (execvp(*argv, argv) < 0) {     
               printf("*** ERROR: exec failed\n");
               exit(1);
          }

     }
     else {                                 
          while (wait(&status) != pid)      
               ;
     }
}
void main(char *envp[])
{
    char line[1024];
    char *argv[64];
    while (1){
      printf("shell>>");
      gets(line);
      printf("\n");
      parse(line, argv);
      if (strcmp(argv[0], "exit")==0)
    exit(0);
      execute(argv);
    }
}

2 个答案:

答案 0 :(得分:1)

您需要:

  • 检查传递的命令中的> [filename]
  • 如果有,请打开相关文件进行输出,并使用dup2将fd附加到分叉流程的stdout

这应该足以让你指出正确的方向。

答案 1 :(得分:1)

在pid == 0的测试之间和运行execvp()之前,你想要这样的代码:

int fd=open(outputfile,O_WRONLY|O_CREAT); 
dup2(fd,1);

这实际上将execvp()运行的程序的stdout设置为这个新文件。您必须修改解析代码才能查找“&gt;”并将其后面的内容解析为文件名并存储在outputfile中。 您还需要进行一些额外的检查以确保新文件打开正常等。