许多系统调用,比如close( fd )
,可能会被信号打断。在这种情况下,通常会返回-1
并设置errno
为EINTR
。
问题是该怎么做?比如说,我仍然希望关闭这个fd
。
我能想到的方法是:
while( close( fd ) == -1 )
if( errno != EINTR ) {
ReportError();
break;
}
有没有人能够建议一种更好/更优雅/更标准的方法来处理这种情况?
更新:
正如mux所指出的那样,在安装信号处理程序时可以使用SA_RESTART
标志。
有人能告诉我在所有POSIX
系统上(不仅仅是Linux
),哪些函数保证是可重入的?
close()
特别是在Linux上,不建议这样做。请在此处阅读:https://lkml.org/lkml/2002/7/17/165 - alk