1

次のようなループで生の HCI ソケットからメッセージを読み取るスレッドがあります。

void* loop_hci (void* args) {
    params_hci_t* params = (params_hci_t*) args;
    int result_hci = 0;
    uint8_t* buf_hci = calloc(1, HCI_EVENT_MAX_LENGTH);
    while (!poll_end()) {
        result_hci = read(params->hci_sock, buf_hci, HCI_EVENT_MAX_LENGTH);
        if (result_hci > 0) {
            // ... do stuff with the received data
        }
    }
    ancs_pdebug("HCI loop shutting down...");
    return NULL;    
}

機能はpoll_end()正常に動作し、意図したとおりです。SIGINT シグナルを受信するまでは 0 を返し、それ以降は 1 を返します。

メインスレッドでは、次のようにソケットを作成します。

hci_sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);

また、スレッド:

ph->hci_sock = hci_sock;
pthread_create(&t_hci, NULL, &loop_hci, ph);

次に、しばらくして、次のようにシャットダウンを呼び出します(メインスレッドで):

shutdown(hci_sock, SHUT_RD);

shutdown() を呼び出した後に read() が返されると想定しています。L2CAP ソケットの別のスレッドで同じメソッドを使用すると、正常に動作します。しかし、そうではありません。pthread_join(t_hci, NULL)メイン スレッドでの呼び出しが返されません。

ソケットは正常に動作します。そこからメッセージを読み取ることができます。代わりに close (スレッドが終了した後に行う) を呼び出そうとしましたが、結果は同じです。

何が問題なのですか、それとも私の仮定が間違っていますか?

4

1 に答える 1