在 Linux 上,C 标准库调用 freadfwrite 执行系统调用等价物 readwrite

系统调用的手册页提到了中断,说在 errno 设置为 EINTR 时可能会发生短写。但是,库函数的手册页没有提及中断。那么,在这些库函数中会发生中断吗?

https://linux.die.net/man/3/fwrite

最佳答案

fread() fwrite() 函数期间(以及在 read() write() 系统调用期间 - 没有办法阻止这种情况。但是,如果发生中断会发生什么情况并不清楚 - 信号是否传递。这取决于关于您的应用程序(线程?)是如何设置来处理中断的。

  • 如果忽略它们,则不会对 fread()fwrite() 产生影响。
  • 如果有默认处理,程序将停止;函数不会返回。
  • 如果您的信号处理程序退出或使用 siglongjmp() (或 longjmp() ),则系统调用将不会返回。
  • 如果您的处理程序返回,它将取决于您在设置处理程序时指定给 sigaction() 的内容。
  • SA_RESTART 表示底层的read或者write会被重试
  • 没有 SA_RESTART 将意味着 readwrite 将终止 - 可能是短读或写,或者可能有错误并且 errno 设置为 EINTR。
  • 如果系统调用提示失败,如果在中断发生前没有读或写数据,fread()fwrite() 很可能也会报告失败。
  • 如果读取或写入某些数据,您可能会得到简短的读取或写入响应。
  • 关于c - 在 fread() 和 fwrite() 库调用期间是否调度了中断信号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53245721/

    10-10 21:57
    查看更多