在我自己的shell中实现here-string重定向后,如何修复“错误文件描述符”

时间:2019-05-14 19:11:57

标签: c linux shell

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

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

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

cat <<< Hello,world!

实际结果:

cat: -: Bad file descriptor

预期:

Hello,world!

这真的很奇怪,因为我基本上已经重复使用了输入重定向(command < file)的实现,而我添加的唯一部分就是有效的部分。所以我真的很茫然我的代码中所缺少的。

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

1 个答案:

答案 0 :(得分:2)

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

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

我建议将open()与标志O_CREAT|O_RDWR|O_TRUNC一起使用

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

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

  • 您忘记了倒带文件描述符

  • 您忘记关闭fd

  • 将此处字符串保存到命名文件中是解决竞争状况的方法, 并可能使文件系统混乱。

如果打算将此处字符串保存到文件中,则应研究O_TMPFLAG,以了解如何在文件系统中创建匿名文件。然后,您无需调用remove(),当所有文件描述符关闭时,该文件将自动删除。