我有一个线程,它在这样的循环中从原始 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);
我假设 read() 应该在我调用 shutdown() 后返回,我在 L2CAP 套接字的不同线程中使用相同的方法并且它工作正常。但事实并非如此。我pthread_join(t_hci, NULL)
在主线程中的调用永远不会返回。
插座工作正常。我可以从中读取消息。我也尝试调用 close (我在线程结束后调用),但结果是一样的。
可能是什么问题,或者我的假设是错误的?