【问题标题】:Why do we still need read() and write() system calls, why can't we replace them with ioctl system call?为什么我们仍然需要 read() 和 write() 系统调用,为什么我们不能用 ioctl 系统调用替换它们?
【发布时间】:2018-11-17 15:56:23
【问题描述】:

在 linux 中,对于所有读写操作,我们使用 read() 和 write() 系统调用。我们也可以对 ioctl() 系统调用做同样的事情,那为什么我们还需要 read() 和 write() 系统调用呢?

使用 read() 和 write() 系统调用而不是 ioctl() 时是否有任何安全性或快速性能?

【问题讨论】:

    标签: c linux io


    【解决方案1】:

    理论上一切都可以使用ioctl() 来完成。但是ioctl() 的目的是提供一种执行杂项、特定于设备的操作的方法。当有大多数设备实现的操作时,最好使用更具体的功能。这允许编译器执行参数类型检查。像ioctl() 这样的通用函数无法检查您是否提供了适合该操作的参数。

    【讨论】:

    • 是的 read() 和 write() 做参数类型检查,是出于安全目的吗?
    • 这只是一般的编码原则。
    • 好的,谢谢。但参数类型检查不是必需的,因为使用 ioctl 执行的大多数设备特定操作也没有此类检查。也不需要(不需要)像我们在 copy_from_user 和 copy_to_user 中那样检查任何权限访问。
    • 这是一种妥协。我们需要一个像ioctl 这样的杂项函数,因为为我们可能想做的所有事情编写特定的函数是不切实际的,所以我们在那里没有参数检查。但我们不希望将其用于常见操作。
    【解决方案2】:

    如果我们删除 read() 和 write(),那么系统将不再兼容 posix(并且许多现有软件会损坏)。同样,如果我们完全依赖 linux ioctl 系统调用,那么我们的代码就不能再移植到其他系统了。

    【讨论】:

    • 所以我们仍然需要读写系统调用来支持posix兼容。
    • @JyothiKumarReddy 符合 SVr4、4.3BSD、POSIX.1-2001。
    猜你喜欢
    • 2021-01-14
    • 2017-11-15
    • 2014-11-28
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多