wpa_supplicant —— wpa_supplicant_fd_workaround说明

本文介绍wpa_supplicant中的FD workaround函数,解决因启动脚本导致的标准输入输出被关闭的问题。通过将标准输入、输出和错误重定向到/dev/null,确保程序正常运行。
该函数具体实现如下:

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这三个文件描述符而导致的程序出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值