在Linux上,C标准库调用fread
和fwrite
执行等效的系统调用read
和write
。
系统调用的手册页提到了中断,表示errno
设置为EINTR
时可能会发生短写。但是,库函数的手册页没有说明中断。那么,在这些库函数期间会发生中断吗?
https://linux.die.net/man/3/fwrite
在fread()
和fwrite()
函数期间(以及在read()
和write()
系统调用期间(,可能会发生中断。但是,如果发生中断,会发生什么还不太清楚——信号是否传递。这取决于应用程序(线程?(如何设置来处理中断。
- 如果忽略它们,则对
fread()
或fwrite()
没有影响 - 如果有默认处理,程序将停止;函数将不会返回
- 如果信号处理程序退出或使用
siglongjmp()
(或longjmp()
(,则系统调用不会返回 - 如果您的处理程序返回,这将取决于您在设置处理程序时为
sigaction()
指定的内容。SA_RESTART
表示将重试底层read
或write
- 没有
SA_RESTART
将意味着read
或write
将终止——可能是由于短暂的读取或写入,或者可能是由于错误和errno
设置为EINTR - 如果系统调用指示故障,则如果在中断发生之前没有读取或写入数据,则
fread()
和fwrite()
也可能报告故障 - 如果某些数据被读取或写入,您可能会得到简短的读取或写入响应