"和 "<")-6ren"> "和 "<")-我应该用 C 编写一个简单的自定义 shell,它可以仅使用“”命令处理重定向。 为此,我解析每个命令(在字符串数组中),检查字符“”,然后使用 open(fd, filename, flags) o-6ren">
gpt4 book ai didi

c - 在 C 的自定义 shell 中执行重定向( ">"和 "<")

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:47 25 4
gpt4 key购买 nike

我应该用 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_CREAT,S_RUSR | S_IRGRP | S_IWGRP | S_IWUSR 并进行错误检查以确保其正确打开。我该如何解决这个问题并让它真正执行我想要的命令?

最佳答案

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

如果是> , 你最好使用 fd = creat(path, mode);系统调用,默认情况下会覆盖和创建。

解析时,execvpe 的 argv 数组应该包括直到但不包括第一个重定向符号 > 的参数或 < . argv 数组应具有最后一个 NULL 指针元素以指示其结束。

重定向应该发生在 fork() 之后子进程中的系统调用,否则你的 shell 将失去其标准 IO 和 exec会彻底消灭它。

/* 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();
}

关于 exec 的含义存在普遍的误解系统调用系列。他们只是简单地丢弃当前程序并用当前进程中的另一个程序替换它。他们不会回来,因为无处可去。

人们通常的意思,可以用 fork 来完成exec wait系统调用,见上文。

关于c - 在 C 的自定义 shell 中执行重定向( ">"和 "<"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28493392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com