wpa_supplicant —— wpa_supplicant_fd_workaround说明

该函数具体实现如下:

static void wpa_supplicant_fd_workaround(int start)    //
{
#ifdef __linux__
    static int fd[3] = { -1, -1, -1 };
    int i;
    /* When started from pcmcia-cs scripts, wpa_supplicant might start with
     * fd 0, 1, and 2 closed. This will cause some issues because many
     * places in wpa_supplicant are still printing out to stdout. As a
     * workaround, make sure that fd's 0, 1, and 2 are not used for other
     * sockets. */
    if (start) {
        for (i = 0; i < 3; i++) {
            fd[i] = open("/dev/null", O_RDWR);    //Open for reading and writing
            if (fd[i] > 2) {
                close(fd[i]);
                fd[i] = -1;
                break;
            }
        }
    } else {
        for (i = 0; i < 3; i++) {
            if (fd[i] >= 0) {
                close(fd[i]);
                fd[i] = -1;
            }
        }
    }
#endif /* __linux__ */
}

中间有段英文说明,翻译过来就是:
如果使用了pcmcia-cs scripts来启动wpa_supplicant,这个时候fd 0,1,2是关闭的。(注意: 习惯上,标准输入fd为0,标准输出为1,标准错误为2)
由于在wpa_supplicant中会使用stdout来输出,如果不管0,1,2三个文件描述符可能会出现一些错误。
所以,就有了该函数。

下面来分析一下该函数:
如果不使用pcmcia-cs scripts,那么第一次调用fd[i] = open("/dev/null", O_RDWR)时,fd[i]取值就是3(开启应用程序时,会默认启动0,1,2三个文件),第二次就是4...
后面紧跟了一个判断,如果fd[i]大于2,就close(fd[i])。整个函数相当与什么都没有做。
如果使用了pcmcia-cs scripts,依据上面的注释,三次调用fd[i] = open("/dev/null", O_RDWR)时,fd[i]取值就是0,1,2;即相当于,将标准输入、标准输出、标准错误重定向到/dev/null中。避免了其他socket使用0,1,2这三个文件描述符而导致的程序出错。

你可能感兴趣的:(wpa_supplicant —— wpa_supplicant_fd_workaround说明)