在C中的自定义shell中执行重定向(“和”)

在C中的自定义shell中执行重定向(“和”),c,shell,unix,dup,C,Shell,Unix,Dup,我应该用C编写一个简单的自定义shell,它只需使用“”命令即可处理重定向 为此,我正在分析每个命令(在字符串数组中),检查字符“”,然后使用open(fd,filename,flags)打开一个文件名以进行读取或写入 如果我发出这些命令(其中%表示我的shell),我希望得到以下输出: % echo hello > output.txt % cat output.txt hello 但是,当我发出这些命令时,实际上任何命令都会忽略(但不是忽略?)我的重定向。这就是我发出相同命令时发生的

我应该用C编写一个简单的自定义shell,它只需使用“”命令即可处理重定向

为此,我正在分析每个命令(在字符串数组中),检查字符“”,然后使用
open(fd,filename,flags)
打开一个文件名以进行读取或写入

如果我发出这些命令(其中%表示我的shell),我希望得到以下输出:

% echo hello > output.txt
% cat output.txt
hello
但是,当我发出这些命令时,实际上任何命令都会忽略(但不是忽略?)我的重定向。这就是我发出相同命令时发生的情况:

% echo hello > output.txt
% cat output.txt
hello > output.txt
奇怪的是,它确实创建了一个名为“output.txt”的文件,并向其中写入“hello>output.txt”

输入和输出重定向器都会发生这种情况。下面是打开并执行输出命令的代码

int fd;
open_write_file(&fd, commands[index]);
dup2(fd, 1);
execvpe(commands[0], commands, envp);
close(fd);

请注意,
open_write_file()
打开文件名,带有标志
O_WRONLY | O_TRUNC | O|u CREAT、S|RUSR | S|u IRGRP | S|u IWGRP | S|IWUSR
,并执行错误检查以确保正确打开。如何解决这个问题并让它实际执行我想要的真正命令?

open的语法是
fd=open(path,flags,[mode])

如果是
,最好使用
fd=creat(路径、模式)系统调用,默认情况下覆盖并创建


解析时,
execvpe
的argv数组应包含最多但不包括第一个重定向符号
的参数,或
使用所有警告和调试信息编译
gcc-Wall-Wextra-g
,然后使用调试器(
gdb
)。另外,查看现有shell的源代码并使用
strace
;您没有显示足够的源代码,我们无法提供帮助。您不应该将重定向传递给execvpe。@user4098326我刚刚尝试使用execvp()执行此操作,但得到了相同的结果。我应该使用什么重新定向?重定向是正确的,但是“>output.txt”被传递给echo。@user4098326得到它:)需要在到达“>或”之前将传递给
execvp()的参数终止为null
/* Parse input line, create argv array, and inputfile/outputfile names */
...
if (fork() == 0) {
  /* Child process: stdin redirection */
  fd_in = open(inputfile, O_RDONLY);
  close(0);
  dup(fd_in);
  close(fd_in);
  /* Child process: stdout redirection */
  fd_out = creat(outputfile, 0644);
  close(1);
  dup(fd_out);
  close(fd_out);
  /* Child process: exec other program */
  execvp(argv[0], argv); /* Does NOT return */
} else {
  /* Parent process: wait until child process exits */
  wait();
}