次のようなループで生の 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 (スレッドが終了した後に行う) を呼び出そうとしましたが、結果は同じです。
何が問題なのですか、それとも私の仮定が間違っていますか?