Если между проверкой файлового дескриптора и произведенной над ним операцией происходит вызов некоторой блокирующей функции, то это позволит провести операцию над закрытым дескриптором, при условии, что он был закрыт в другом потоке. 

Пример:

dup2() vs. close(). Relevant file: kern/kern_descrip.c
sys_dup2(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
[snip]
if ((u_int)old >= fdp->fd_nfiles || fdp->fd_ofiles[old] == NULL ||
(u_int)new >= p->p_rlimit[RLIMIT_NOFILE].rlim_cur ||
(u_int)new >= maxfiles)
return (EBADF);
[snip]
if (new >= fdp->fd_nfiles) {
[snip]
} else {
(void) fdrelease(p, new);
}
return (finishdup(fdp, old, new, retval));
}
[snip]
finishdup(fdp, old, new, retval)
register struct filedesc *fdp;
register int old, new;
register_t *retval;
{
register struct file *fp;
fp = fdp->fd_ofiles[old];
if (fp->f_count == LONG_MAX-2)
if (global_var) {
blocking_call();
if (global_var->f_count)
}

Оставить мнение