fread() 和 fwrite() 函数调用期间是否会分发中断信号?

7
在Linux系统中,C标准库调用fread和fwrite会执行对应的系统调用read和write。系统调用的man手册提到了中断,说明短写可能会导致errno设置为EINTR。然而,库函数的man手册没有提及中断。因此,在这些库函数执行期间是否会发生中断呢?请参考以下链接:https://linux.die.net/man/3/fwrite

man 7 linux signal 是了解系统调用期间信号中断的好地方。 - JiaHao Xu
1个回答

7

fread()fwrite() 函数(以及 read()write() 系统调用)在执行期间可能会发生中断,无法阻止。但是,如果发生中断,信号是否被传递并不清楚。这取决于您的应用程序(线程?)如何设置来处理中断。

  • 如果忽略中断,则对 fread()fwrite() 没有影响。
  • 如果使用默认处理方式,则程序将停止;函数不会返回。
  • 如果信号处理程序退出或使用 siglongjmp()(或 longjmp()),则系统调用不会返回。
  • 如果您的处理程序返回,则将取决于设置处理程序时指定给 sigaction() 的内容。
    • SA_RESTART 表示底层的 readwrite 将被重试。
    • 没有 SA_RESTART 将意味着 readwrite 将终止 - 可能会出现短读或写,或者可能会出现错误并且将 errno 设置为 EINTR。
    • 如果系统调用表示失败,则在中断发生之前未读取或写入数据,则很可能 fread()fwrite() 也会报告失败。
    • 如果读取或写入了一些数据,则可能会获得短读或写的响应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接