在C中的自定义shell中执行重定向(“和”)
我应该用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 但是,当我发出这些命令时,实际上任何命令都会忽略(但不是忽略?)我的重定向。这就是我发出相同命令时发生的
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();
}