【问题标题】:Use sys_open from kernel level从内核级别使用 sys_open
【发布时间】:2021-07-25 06:59:03
【问题描述】:

嗨,我在使用 sys_open 时遇到了一些问题。此时我开始认为我对函数的参数做错了。 我如何使用它的一个例子:

fd = sys_open("file.txt" , O_WRONLY | O_CREAT, 0);
sys_write(fd, "test\n", strlen("test\n"));
sys_fsync(fd);
sys_fdatasync(fd);
sys_close(fd);

fd 值是一个非负整数 (0) 。 每个函数都返回 0,所以我猜它们是正确执行的。除了 sys_write。 每次我在写完文件后去查找文件时,我永远找不到任何想法,也许我的代码有问题?

【问题讨论】:

  • 意思是sys_open返回fd = 0?
  • 是的,如果我删除 O_CREAT,它会返回 0,它会返回负数,但我有另一个代码,它使用 sys_creat 创建文件
  • 来自open syscall descriptionThe mode argument specifies the file mode bits to be applied when a new file is created. If neither O_CREAT nor O_TMPFILE is specified in flags, then mode is ignored (and can thus be specified as 0, or simply omitted). The mode argument must be supplied if O_CREAT or O_TMPFILE is specified in flags; if it is not supplied, some arbitrary bytes from the stack will be applied as the file mode.
  • 我很抱歉,但我失去了你,所以我使用 O_CREAT 或 O_TMPFILE 我必须给出第三个参数?我理解它 coreclty 吗?
  • 是的,如果你执行 O_CREATE 那么你必须提供一个模式参数(参数 3),否则你会得到未定义的行为。通常文件描述符fd 0 用于标准输入,因此从文件上的 sys_open 获取 0 是一个坏信号。阅读我发布的链接并更新您的模式位参数。如果它回答了您的问题,请告诉我,我可以将其作为答案发布

标签: c linux file linux-kernel operating-system


【解决方案1】:

Linux 的sys_ 系列函数被认为是deprecated now。然而,就这个问题而言,sys_open 是一个用户级函数,它调用open 系统调用,然后调用内核级do_sys_open(),后两者在fs/open.c 中定义。因此,要从内核中打开文件,您应该坚持使用内核级函数而不是用户级函数。

Here are some answers关于在内核级别打开文件,其中一些也已弃用,因此请注意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多