【问题标题】:Implementing lseek in xv6在 xv6 中实现 lseek
【发布时间】:2019-06-06 16:05:54
【问题描述】:

首先我得说我完全有可能遗漏了什么。 我的任务是实质上实现'fprintf'。现在虽然不需要附加到文件,但我喜欢超越。 我的问题是,我在 xv6 中找不到 lseek 的定义,这意味着我必须自己实现它,但我真的不知道如何去做。

尝试在无限循环中一次读取 512 个字节以尝试将光标移到末尾,作为硬编码的一种方式,但如果文件未使用 O_RDWR 打开或我尝试使用 stdout 则失败.

我也试过在无限循环上写一个空字符串。知道这行不通,但还是尝试了。

我可以很好地阅读xv6(用户级程序),但我一生都看不懂lseek的源代码

不一定是真正的 lseek。我只需要能够到达 fd 的末尾并继续写入,但这不能依赖于文件模式。

非常感谢任何帮助。

【问题讨论】:

  • 为什么fprintf需要寻找?
  • @melpomene 我正在尝试让附加模式(“a”)正常工作
  • fprintf 不需要关心模式。 "a" 应该在 fopen 中实现(只需将 O_APPEND 传递给 open)。
  • @melpomene 既然你提到了...我已经将 O_APPEND 传递给 open()。我在 sys_open 的定义名称“off”中找到了一些东西,所以我认为这是偏移量。我把它弄乱了,看看我能不能让 O_APPEND 工作。谢谢

标签: c fcntl xv6 lseek


【解决方案1】:

我找到了解决方案。 O_APPEND 不起作用的原因是 sysfile.c 中 open() 的定义对 append 没有任何作用。 在 sys_open 中,他们将 f->off(偏移)的值硬编码为 0,这是我需要更改的。 我计划的解决方案是找出文件的文件大小(以字节为单位),并将偏移量设置为该数字。 可能会使用 stat()。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多