调用系统调用的时候,有时系统调用会被中断.此时,系统调用会返回-1,并且错误码被置为EINTR.但是,有时并不将这样的情况作为错误.有两种处理方法:
1.如果错误码为EINTR则重新调用系统调用,例如Postgresql中有一段代码:
- retry1:
- if (send(port->sock, &SSLok, 1, 0) != 1)
- {
- if (errno == EINTR)
- goto retry1; /* if interrupted, just retry */
2.重新定义系统调用,忽略错误码为EINTR的情况.例如,Cherokee中的一段代码:
- int
- cherokee_stat (const char *restrict path, struct stat *buf)
- {
- int re;
- do {
- re = stat (path, buf);
- } while ((re == -1) && (errno == EINTR));
- return re;
- }