【发布时间】: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