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

标签 c linux shell

<分区>

我正在一点一点地开发我自己的 shell,并最终实现了 I/O 重定向功能。我已经完成了 > 的实现, <>> .我坚持执行 <<< .

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

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

cat <<< Hello,world!

实际结果:

cat: -: Bad file descriptor

预期:

Hello,world!

这真的很奇怪,因为我基本上重新使用了输入重定向 ( command < file ) 的实现,而我添加的唯一部分是有效的部分。所以我真的不知道我的代码中缺少什么。

如果需要更多代码,请告诉我。

最佳答案

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

O_CREATO_TRUNC 在您的情况下有意义。 O_WRONLY 没那么多。

我建议使用带有标志 O_CREAT|O_RDWR|O_TRUNCopen()

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

  • 'creat()' 'write()' 和 'dup2()' 没有错误检查!!

  • 您忘记倒回您的文件描述符

  • 您忘记关闭fd

  • 将 here-string 保存到命名文件会导致竞争条件问题, 并可能在文件系统中留下困惑。

如果您打算将 here-string 保存到文件中,您应该研究关于如何在文件系统中创建匿名文件的 O_TMPFLAG。然后你不需要调用remove(),当所有文件描述符都关闭时,文件将自动删除。

关于c - 在我自己的 shell 中实现 here-string 重定向后如何修复 'Bad file descriptor',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56137085/

相关文章:

c - Goertzel算法在C中的实现

c++ - 将矩阵应用于图像,寻求性能改进

c - 获取用户输入,将其添加到数组中正确的索引处(升序)

java - 从java类在ubuntu中执行sudo命令

bash - 如果命令不可用,如何定义要调用的后备命令

bash - 调试我的 cron 应用程序

c - brk() 上的 Bash 脚本段错误

c - 向 ftw() 发送参数

linux - Linux下Eclipse在哪里找eclipse.ini

bash - 如何将输出限制为终端宽度