- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我制作了一个线程,可以读取从手机发送的蓝牙消息。
当我意识到我无法安全地杀死那个线程时,我的问题就来了。到目前为止的方法是用户输入,称为 exit()
从该线程中,当我将其移出该线程并进入主线程时,所有奇怪的事情都开始发生(检测到堆栈粉碎和段错误)。显然,如果我有另一个用于 wifi 调用的线程或者只是不想完全退出所有内容,这种方法也不会真正很好地扩展。
到目前为止,这是我的代码。
将蓝牙相关的东西传递给线程的结构:
typedef struct {
struct sockaddr_rc loc_addr;
struct sockaddr_rc rem_addr;
socklen_t opt;
char blu_buffer[1024];
int blu_sock;
} Bluetooth_stuff;
void * BluetoothListiner(void * argv){
Bluetooth_stuff * bt_set = (Bluetooth_stuff * ) argv;
int bytes_read;
int local_client;
int option = 0;
listen(bt_set->blu_sock, 1);
memset(bt_set->blu_buffer, 0, sizeof(bt_set->blu_buffer));
while(true){
local_client = accept(bt_set->blu_sock, (struct sockaddr *)&((*bt_set).rem_addr), &((*bt_set).opt));
// read data from the client
bytes_read = read(local_client, bt_set->blu_buffer, sizeof(bt_set->blu_buffer));
if( bytes_read > 0 ) {
// process data
}
}
else{
// accept again?
}
// clear the buffer
memset(bt_set->blu_buffer, 0, sizeof(bt_set->blu_buffer));
// close connection
close(local_client);
usleep(10);
}
}
void BluetoothSocketConfig(Bluetooth_stuff * bt_set){
// allocate socket
bt_set->blu_sock = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
bt_set->opt= sizeof(bt_set->rem_addr);
(*bt_set).loc_addr.rc_family = AF_BLUETOOTH;
(*bt_set).loc_addr.rc_bdaddr = *BDADDR_ANY;
(*bt_set).loc_addr.rc_channel = (uint8_t) 1;
// bind socket to port 1 of the first available
bind(bt_set->blu_sock, (struct sockaddr *)&(bt_set->loc_addr), sizeof(bt_set->loc_addr));
}
int main(int argc, char *argv[]){
Bluetooth_stuff bt_set;
BluetoothSocketConfig(&bt_set);
pthread_create(&blu_listiner, NULL, BluetoothListiner, bt_set);
while(1); // I modify that for testing to exit, having a global flag also gave me segmentation errors somehow
}
exit(1)
不清理其他线程和
pthread_kill
或
pthread_cancel
从另一个线程通常会导致仍在后台运行的进程阻止我再次运行应用程序,而无需使用
ps -A
手动终止进程和
kill -9 PROCESS
.
if
在线程中声明并拥有它
pthread_exit
自己陷入了遗忘。如:
if(external_exit){
ret2 = 200;
pthread_exit(&ret2);
}
read()
是阻塞电话,我永远无法到达
if
声明没有外部发生的事情。这个
answer建议使用超时来实现这一点,我遵循了
answer 中的语法设法突破
read()
一段时间后。所以我在线程的主while循环之前添加了这个(我认为这应该只定义一次,而不是在每个循环中,虽然不确定因为找不到具体的例子)。
read()
在第一个循环上,但随后会跳过它,好像什么都没有,只是无限循环。我试图通过重新调用
read()
来“重新启用
accept()
”
listen()
和
bind()
没有成功。似乎使用
select()
是首先检查是否有要阅读的内容的首选选项,但如手册中所述
read()
上。没有办法安全地杀死它。
select()
因为我没有多个连接,所以真的需要阻塞方法吗?
read()
的正确使用的程序是什么?初始超时后处于阻塞模式?
最佳答案
SOCK_NONBLOCK
打开套接字并在其整个生命周期内保持非阻塞模式。 eventfd(0,0)
创建另一个文件描述符。 read
,设置并调用select
等待两个 eventfd 文件描述符和套接字(通过 NULL
用于超时)。这可以永远阻塞。 read
.你是对的 select
可能会错误地发出信号,但在这种情况下,您会得到 EAGAIN
并且可以循环返回并调用select
再次。如果 read
返回任何其他错误,通过关闭连接等“处理”它。write
到 eventfd 文件描述符以“中断”选择操作。 关于c - 如何杀死/结束/取消/加入套接字阻塞线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61110852/
我想对 JOIN 进行特定的排序 SELECT * FROM (lives_in as t1 NATURAL JOIN preferences p1) l1 JOIN (lives_in t2 NAT
我正在努力解决一个查询。并想知道是否有人可以提供帮助。 我有一个标签表(服务请求票)和序列号表 从我的标签中我正在这样做 Select * from tag where tag.created BET
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我有两个表 tbl_user 和 tbl_lastchangepassword,如下所示 表 tbl_user id| name --------- 1 | user1 2 | user2 3 |
我有下一个问题 SELECT i.*, gu.* vs.* FROM common.global_users gu LEFT JOIN common.global_users_perms gup ON
我有一个电影表和一个投票表。用户为他们喜欢的电影投票。我需要显示按电影总票数降序排列的电影列表。我现在所拥有的有点作品。唯一的问题是它不显示 0 票的电影。 SELECT m.name, m.imdb
我有一个由这样的表组成的 mySql 数据库: 我如何(如果可能的话)使用 JOINS 从名称/周期表中获取结果?简单来说,它是如何工作的?我向菜鸟问题道歉。我对此很陌生。任何帮助将不胜感激。 最佳答
我需要查询单元先决条件的自引用关系。 我知道您需要使用两个联接,我是否选择我的列然后将其联接到自身? SELECT u.unit_code, u.name + ' is a prerequisi
我有两个实体,用户和友谊,它们看起来像: public class User { public int UserId { get; set; } (..
假设我有两个表: Table A ProdID | PartNumber | Data... 1 | ABC-a | "Data A" 2 | (null) |
说我有这个数据, (df <- data.frame( col1 = c('My','Your','His','Thir'), col2 = c('Cat','Dog','Fish','Dog')))
我有两个这样的数组,实际上这是从两个不同的服务器检索的 mysql 数据: $array1 = array ( 0 => array ( 'id' => 1, 'n
我的数据库中有以下表格 CREATE TABLE [author_details] ( [_id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [name
我正在努力使用一个相当简单的 sql select 语句的 join/where 子句。 我正在尝试从 tb1 中检索产品信息列表,其中 where 条件位于 tbl2 中,但这必须由三个不同的列连接
我正在寻找以下功能: Applicative f => f (f a) -> f a Hoogle给我看join : >:t join join :: Monad m => m (m a) -> m
我有两个“表”,分别是 USER 和 CONGE。在表“CONGE”中,我插入了用户的 ID。但是我不知道如何根据用户的id显示用户的休假。 我想根据id发布“Congé”。 { "conge"
我们有一个具有(简化)结构的文档,如Elasticsearch所示: { _id: ..., patientId: 4711, text: "blue" } { _id: ..., patientId
这两个sql语句有什么区别 a) 从 T1,T2 中选择 *,其中 T1.A=T2.A ; b) 从 T1,T2 中选择 *,其中 T2.A=T1.A ; 在这两种情况下我得到相同的输出,这两种语句之
我想做一个简单的连接,只是比较两个表中的 ID.. 我有我的组表,包含; 身份证 姓名 等.. 我的 GroupMap 表包含; 身份证 组号 元素编号 我的查询采用 GroupMap.ItemID
所以我有一组主要数据,如下所示: value_num code value_letter 1 CDX A 2 DEF B
我是一名优秀的程序员,十分优秀!