【问题标题】:*NIX read()/write(): Are they re-entrant?*NIX read()/write():它们是可重入的吗?
【发布时间】:2018-09-18 21:40:40
【问题描述】:

如果一个中断/线程在read(fd,buff,size)write(fd,buff,size) 函数的执行过程中抢占然后返回到它在read()/write() 中的位置会发生什么? 我们可以假设它将继续读取或写入文件描述符而不会丢失数据和顺序吗?

假设没有共享变量需要担心同步。

【问题讨论】:

    标签: c linux unix operating-system


    【解决方案1】:

    readwrite 是系统调用,因此从用户空间的角度来看,它们是“原子的”——中断或线程无法在执行的“中间”抢占它们.任何信号都将在系统调用完成后传递——如果它是一个中断信号,它可能会导致“短”读取或写入(读取或写入的字节数比预期的少)或EINTR 错误值,在这种情况下用户级程序(在中断和系统调用后恢复时)将需要处理。

    【讨论】:

    • 有趣...所以即使系统调用由于某种原因被阻塞,它也不会被任何线程抢占?那不是很糟糕吗?
    • 如果它的阻塞和一个信号发生,那么它将被中断并返回 EINTR——这可能会被标准库自动处理,重做系统调用。系统调用中被阻塞的线程不使用 CPU,因此操作系统会在该 CPU 上调度其他线程或进程。
    • 所以即使操作系统调度了一些线程,在返回时,它也会在安全的地方继续。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多