【问题标题】:Executing redirection ( ">" and "<" ) in custom shell in C在 C 中的自定义 shell 中执行重定向(“>”和“<”)
【发布时间】:2015-02-13 05:56:14
【问题描述】:

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

【问题讨论】:

  • 编译所有警告和调试信息gcc -Wall -Wextra -g 然后使用调试器 (gdb)。另外,查看现有 shell 的源代码并使用strace;您没有提供足够的源代码供我们提供帮助。
  • 您不应将重定向传递给 execvpe。
  • @user4098326 我刚刚尝试使用 execvp() 执行此操作,但得到了相同的结果。我应该使用什么来重定向?
  • 重定向正确,但是" > output.txt" 传递给echo。
  • @user4098326 知道了 :) 需要在传递给 execvp() 的参数到达 ">" 或 " 之前终止它

标签: c shell unix dup


【解决方案1】:

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

如果是&gt;,最好使用fd = creat(path, mode); 系统调用,它会默认覆盖并创建。

解析时,execvpe 的 argv 数组应包括但不包括第一个重定向符号 &gt;&lt; 的参数。 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 系统调用家族的作用存在普遍的误解。他们只是丢弃当前程序并用当前程序中的另一个程序替换它。他们不会回来,因为无处可去。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多