【问题标题】:Linux | Shell implementation in C | Input redirection does not displayLinux | C 中的 Shell 实现 |输入重定向不显示
【发布时间】:2012-11-13 19:44:57
【问题描述】:

我在 C 中实现 shell,在实现重定向操作时,我看到输出重定向工作正常,但输入重定向操作没有做任何事情。 (标准输出中没有显示)

COMMAND-> wc < out.txt
Child 12878 died 0x008B

COMMAND->

[COMMAND-> 是我的提示]

当我打印孩子死亡时的状态时,它的值是 0x8B。这是否意味着什么?

我已经关注了这篇文章,重定向实现的核心部分与此处的建议类似。 Implementing shell in C and need help handling input/output redirection

这是输入重定向时发生的事情的要点:

in = open(file_name, O_RDONLY);
dup2(in,0);
close(in);
execvp("wc",args);

(我不能发布我的整个代码,因为这是一个现场作业,我可能最终会被 MOSS 抓住)

【问题讨论】:

  • 退出代码 0x008b(139:分段违规)通常意味着它被 SIGSEGV 终止,您在某处有分段错误,gdb 应该能够告诉您更多信息。
  • gdb 没有将其检测为分段错误。行为相同。
  • 我要补充一点,因为 wc 本身不太可能出现段错误,即使你给了它无效的文件描述符,段错误可能在 fork 调用和实际命令的 exec 之间最有可能在代码中设置重定向(正如你所说,它只会在重定向失败)。
  • 您必须在gdb 中设置跟踪到子进程。使用set follow-fork-mode child。它将跟踪第一个孩子,因此您只需在运行命令之前设置它。
  • 回溯在哪里?根据您提供的内容,很难正确地“想象”这一切;需要更多信息以避免猜测。 args 是什么?很多问题,上面的代码再次看起来很好。 @Vinoth,strace -f 也很有见地。

标签: c linux shell io-redirection


【解决方案1】:

execvp 中传递的指针是NULL,因此得到了SIGSEGV

输入命令的后端处理基于管道和重定向进行隔离有错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 2016-03-10
    • 2012-07-15
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多