<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                Android平臺中,main函數定義于main.c中,代碼如下所示。 **main.c::main** ~~~ int main(int argc, char *argv[]) { int c, i; struct wpa_interface *ifaces, *iface; int iface_count, exitcode = -1; struct wpa_params params; struct wpa_global *global; /* Android平臺中,下面這個函數的實現在os_unix.c中。Android對其做了一些修改,主要是權 限方面的設置防止某些情況下被破解者利用權限漏洞以獲取root權限。 */ if (os_program_init()) return -1; os_memset(&params, 0, sizeof(params)); params.wpa_debug_level = MSG_INFO; iface = ifaces = os_zalloc(sizeof(struct wpa_interface)); ...... iface_count = 1; wpa_supplicant_fd_workaround(); // 輸入輸出重定向到/dev/null設備 for (;;) { // 參數解析,由圖4-3所知,Note 2中WPAS啟動只使用了4個參數 c = getopt(argc, argv, "b:Bc:C:D:de:f:g:hi:KLNo:O:p:P:qstuvW"); if (c < 0) break; switch (c) { ...... case 'c': // 指定配置文件名。注意,該參數賦值給了wpa_interface中的變量 iface->confname = optarg; break; ...... case 'D': // 指定driver名稱。注意,該參數賦值給了wpa_interface中的變量 iface->driver = optarg; break; ...... case 'e': // 指定初始隨機數文件,用于后續隨機數的生成[^①] params.entropy_file = optarg; break; ...... case 'i': iface->ifname = optarg; // 指定網絡設備接口名,本例是"wlan0" break; ...... } } exitcode = 0; // 關鍵函數①:根據傳入的參數,創建并初始化一個wpa_global對象 global = wpa_supplicant_init(&params); ...... for (i = 0; exitcode == 0 && i < iface_count; i++) { ...... // 關鍵函數②:WPAS支持操作多個無線網絡設備,此處需將它們一一添加到WPAS中 // WPAS內部將初始化這些設備 if (wpa_supplicant_add_iface(global, &ifaces[i]) == NULL) exitcode = -1; } // Android平臺中,wpa_supplicant通過select或epoll方式實現多路I/O復用。相關解釋見下文 if (exitcode == 0) exitcode = wpa_supplicant_run(global); wpa_supplicant_deinit(global); ......// 退出 return exitcode; } ~~~ main函數中出現了幾個重要的數據結構和兩個關鍵函數。 >[info] **注意** 雖然WPAS代碼遵循C語法,但筆者也將稱結構體實例稱為對象。 先來認識這幾個重要數據結構,如圖4-7所示。 :-: ![](https://box.kancloud.cn/c513f785efed8ed7690d0dde4a3bd11c_1256x346.jpg) 圖4-7 main函數中重要的數據結構 圖4-7中: * wpa_interface用于描述一個無線網絡設備。該參數在初始化時用到。 * wpa_global是一個全局性質的上下文信息。它通過ifaces變量指向一個wpa_supplicant對象(以后介紹wpa_supplicant時,讀者將發現系統內的所有wpa_supplicant對象將通過單向鏈表連接在一起。所以,嚴格意義上來說,ifaces變量指向一個wpa_supplicant對象鏈表)。drv_priv包含driver wrapper所需要的全局上下文信息。其drv_count代表當前編譯到系統中的driverwrapper個數(詳情見下文)。另外,wpa_global有一個全局控制接口,如果設置該接口,其他wpa_interface設置的控制接口將被替代。 * wpa_supplicant是WPAS的核心數據結構。一個interface對應有一個wpa_supplicant對象,其內部包含非常多的成員變量(圖4-7并未畫出,下文詳細介紹)。另外,系統中所有wpa_supplicant對象都通過next變量鏈接在一起。 * ctrl_iface_global_priv是全局控制接口的信息,內部包含一個用于通信的socket句柄。 **提示** 由于篇幅原因,筆者將根據情況略去數據結構中部分成員變量的介紹。 下面分析關鍵函數wpa_supplicant_init。 [^①]:讀者可閱讀《深入理解Android:卷Ⅱ》3.3節以了解Android平臺中更多和隨機數有關的知識。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看