我正在阅读DJB的"关于Qmail 1.0十年后安全性的一些想法",他列出了这个函数用于移动文件描述符:
int fd_move(to,from)
int to;
int from;
{
if (to == from) return 0;
if (fd_copy(to,from) == -1) return -1;
close(from);
return 0;
}
我突然想到这段代码没有检查close的返回值,所以我读了man页面close(2),看起来它可能会失败EINTR,在这种情况下,适当的行为似乎是再次调用close用同样的论点.
由于这段代码是由在C和UNIX上经验丰富的人编写的,并且在qmail中已经保持了十多年不变,我认为必须有一些我缺少的细微差别才能使这段代码正确.任何人都可以向我解释这种细微差别吗?
当一个文件描述符被复制时,就像在fd_copyordup2函数中一样,您最终将得到多个文件描述符引用同一事物(即struct file在内核中相同)。关闭其中一个只会减少其引用计数。除非是最后一次关闭,否则不会对底层对象执行任何操作。因此,诸如EINTR和 之类的条件EIO是不可能的。