<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                1. 建立對外通信的鏈路 RIL_register函數將創建兩個監聽端socket,它們的名字分別是: - “rild”:這個socket用來和Java層的應用通信。這一點與Vold中的MountService類似。 - “rild-debug”:這個socket用來接收測試程序的測試命令。 下面來看RIL_register函數的代碼,如下所示: **Ril.cpp** ~~~ extern "C" void RIL_register (constRIL_RadioFunctions *callbacks) { //RIL_RadioFunctions結構體由RefRil庫輸出 intret; intflags; ......//版本檢測 if(s_registerCalled > 0) { return; } //拷貝這個結構體的內容到s_callbacks變量中。 memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); s_registerCalled = 1; //Rild定義了一些Command,這里做一個小小的檢查 for(int i = 0; i < (int)NUM_ELEMS(s_commands); i++) { assert(i == s_commands[i].requestNumber); } for(int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) { assert(i + RIL_UNSOL_RESPONSE_BASE == s_unsolResponses[i].requestNumber); } ...... //start listen socket #if 0 ...... #else //SOCKET_NAME_RIL的值為“Ril”,這個socket由init進程根據init.rc的配置創建 s_fdListen = android_get_control_socket(SOCKET_NAME_RIL); ...... //監聽 ret =listen(s_fdListen, 4); ...... #endif /* 構造一個非超時任務,處理函數是listenCallback。這個任務會保存在監控表中,一旦它的FD 可讀就會導致eventLoop的select函數返回。根據前面的介紹可知,listen端的socket 可讀表示有客戶connect上。由于該任務的persist被設置為false,待listenCallback 處理完后,這個任務就會從監控表中移除。也就是說下一次select的readFDs中將不會有 這個監聽socket了,這表明Rild只支持一個客戶端的連接。 */ ril_event_set (&s_listen_event, s_fdListen, false, listenCallback, NULL); //觸發eventLoop工作 rilEventAddWakeup (&s_listen_event); #if 1 /* Rild為了支持調試,還增加了一個Ril_debug的socket,這個socket專門用于 測試程序發送測試命令 */ s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG); ret =listen(s_fdDebug, 4); ...... //添加一個非超時任務,該任務對應的處理函數是debugCallback,它是專門用來處理測試命令的。 ril_event_set (&s_debug_event, s_fdDebug, true, debugCallback, NULL); rilEventAddWakeup (&s_debug_event); #endif } ~~~ 根據上面的分析,如果有一個客戶端connect上Rild,eventLoop就會被觸發,并且對應的處理函數listenCallback會被調用,下面就去看看這個函數的實現。 **Ril.cpp** ~~~ static void listenCallback (int fd, short flags,void *param) { intret; interr; intis_phone_socket; RecordStream *p_rs; structsockaddr_un peeraddr; socklen_t socklen = sizeof (peeraddr); structucred creds; socklen_t szCreds = sizeof(creds); structpasswd *pwd = NULL; //接收一個客戶端的連接,并將返回的socket保存在s_fdCommand中 s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr,&socklen); ...... errno= 0; is_phone_socket = 0;//權限控制,判斷連接的客戶端有沒有對應的權限。 ......//如果沒有對應的權限則中止后面的流程 //設置這個socket為非阻塞,所以后續的send/recv調用都不會阻塞 ret =fcntl(s_fdCommand, F_SETFL, O_NONBLOCK); ...... /* p_rs為RecordStream類型,它內部會分配一個緩沖區來存儲客戶端發來的數據, 這些都是socket編程常用的做法。 */ p_rs =record_stream_new(s_fdCommand, MAX_COMMAND_BYTES); /* 構造一個新的非超時任務,這樣在收到來自客戶端的數據后就會由eventLoop調用對應的 處理函數processCommandsCallback了。 */ ril_event_set (&s_commands_event, s_fdCommand, 1, processCommandsCallback, p_rs); rilEventAddWakeup (&s_commands_event); onNewCommandConnect();//作一些后續處理,有興趣的讀者可以看看。 } ~~~ 2. RIL_register小結 RIL_register函數的主要功能是初始化了兩個用來和外部進程通信的socket,并且向eventLoop添加了對應的任務。 至此,Rild的main函數就都分析完了。下面對main函數進行總結。
                  <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>

                              哎呀哎呀视频在线观看