我正在一点一点地在自己的Shell上工作,并实现了I / O重定向功能。我已经完成了>
,<
和>>
的实现。我被困在实现<<<
上。
我尝试过的<<<
实现在概念上非常简单。创建一个名为herestring的文件,将字符串写入文件,将文件描述符设置为STDIN_IN,执行命令,然后删除文件。
文件的目的是基本上存储字符串。 正在成功创建和删除文件。甚至在文件中写入字符串也可以正常工作。但是,当我在自己的shell中执行以下命令时:
cat <<< Hello,world!
实际结果:
cat: -: Bad file descriptor
预期:
Hello,world!
这真的很奇怪,因为我基本上已经重复使用了输入重定向(command < file
)的实现,而我添加的唯一部分就是有效的部分。所以我真的很茫然我的代码中所缺少的。
如果需要更多代码,请告诉我。
答案 0 :(得分:2)
根据man creat
,对creat()
的调用等效于使用等于open()
的标志调用O_CREAT|O_WRONLY|O_TRUNC
。
O_CREAT
和O_TRUNC
在您的情况下很有意义。 O_WRONLY
没那么多。
我建议将open()
与标志O_CREAT|O_RDWR|O_TRUNC
一起使用
您显示的代码的其他问题:(这不是完整的列表!)
没有对'creat()''write()'和'dup2()'进行错误检查!
您忘记了倒带文件描述符
您忘记关闭fd
将此处字符串保存到命名文件中是解决竞争状况的方法, 并可能使文件系统混乱。
如果打算将此处字符串保存到文件中,则应研究O_TMPFLAG
,以了解如何在文件系统中创建匿名文件。然后,您无需调用remove()
,当所有文件描述符关闭时,该文件将自动删除。