首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我自己的shell中实现here-string重定向后,如何修复'Bad file descriptor‘

在我自己的shell中实现here-string重定向后,如何修复'Bad file descriptor‘
EN

Stack Overflow用户
提问于 2019-05-15 03:11:57
回答 1查看 261关注 0票数 0

我正在一点一点地研究我自己的shell,并最终实现了I/O重定向功能。我已经完成了><>>的实现。我被困在实现<<<上了。

我尝试过的<<<实现在概念上非常简单。创建一个名为herestring的文件,将该字符串写入文件中,将文件描述符设置为STDIN_IN,然后执行命令,然后删除该文件。

该文件的目的基本上是存储字符串。正在成功创建和删除该文件。即使是在文件中写入字符串也是有效的。但是,当我在自己的shell中执行以下命令时:

代码语言:javascript
复制
cat <<< Hello,world!

实际结果:

代码语言:javascript
复制
cat: -: Bad file descriptor

期望值:

代码语言:javascript
复制
Hello,world!

这真的很奇怪,因为我基本上重用了输入重定向(command < file)的实现,并且我添加的唯一部分是可以工作的部分。所以我真的对我的代码中缺少的东西感到迷惑。

如果需要更多代码,请让我知道。

EN

回答 1

Stack Overflow用户

发布于 2019-05-15 04:01:06

根据man creat的说法,调用creat()等同于使用等于O_CREAT|O_WRONLY|O_TRUNC的标志调用open()

在您的情况下,O_CREATO_TRUNC是有意义的。O_WRONLY并非如此。

我建议使用带有O_CREAT|O_RDWR|O_TRUNC标志的open()

您所展示的代码的其他问题:(这不是一个完整的列表!!)

  • 在'creat()‘、'write()’和'dup2()‘上没有错误检查!!
  • 您忘记了倒带文件,忘记关闭fd
  • 将here字符串保存到命名文件是解决争用条件问题的秘诀,并且可能会在creat中留下混乱

如果您打算将here-string保存到一个文件中,那么您应该学习有关如何在文件系统中创建匿名文件的O_TMPFLAG。这样就不需要调用remove(),当文件的所有文件描述符都关闭时,该文件将被自动删除。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56137085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档