c - 标准文件描述符 - 如果缺少则打开

时间:2014-11-04 07:54:58

标签: c git stdio

我在git源代码的 setup.c 中看到了以下函数。

代码:

/* if any standard file descriptor is missing open it to /dev/null */
void sanitize_stdfds(void)
{
        int fd = open("/dev/null", O_RDWR, 0); 
        while (fd != -1 && fd < 2)
                fd = dup(fd);
        if (fd == -1) 
                die_errno("open /dev/null or dup failed");
        if (fd > 2)
                close(fd);
}

它尝试打开stdio文件描述符(0/1/2)到/ dev / null,如果它们丢失了。

我的问题是:

while (fd != -1 && fd < 2)中,为什么要使用 2 ,而不是 3

2 个答案:

答案 0 :(得分:2)

因为如果fd == 2你打开了文件描述符0,1,2并且没有其他事可做。您只需要为stdin,stdout和stderr打开这3个描述符。

如果放在那里3,循环将打开文件描述符0,1,2,3。然后行if (fd > 2) close(fd);将关闭描述符3.因此它将在两种情况下都有效,但原始解决方案更好。

答案 1 :(得分:1)

fd < 2的原因是因为您已经调用了方法int fd = open("/dev/null", O_RDWR, 0);

“成功调用(打开)返回的文件描述符将是当前未为该进程打开的编号最小的文件描述符。”因此,如果缺少stdio文件描述符(0/1/2),则open的返回已经占用了丢失的文件描述符。然后你应该用2而不是3来判断。