- 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/
是否可以使用标准输入/标准输出在 bash 中压缩/解压缩字符串? 我试过了,但显然不支持它? hey=$(echo "hello world" | gzip -cf) echo $hey # ret
我的任务是让一个企业网站适用于 IE7,它必须“足够好”,因此我禁用了任何导致问题的花哨/非必要功能。 其中之一是正在使用的搜索栏,需要进行哪些搜索,我猜测幕后某个地方有某种 JavaScript 用
我有一个执行大量处理的小程序。您可以通过按回车键打印进度。 我实现它的方法是在主线程中完成处理,同时我有一个 pthread 不断循环 getchar() 以等待输入键。 问题是当我完成处理时。发生这
我完全理解 suspendCoroutine 与 suspendCancellableCoroutine 在我的示例中的工作方式。但我想知道为什么 println("I finished") (第 1
我是 QT 的新手。目前在我的项目中我实现了 QFileDialog . 在我的用例中:每当用户选择一个文本文件时,它都会执行 functionA .但是,我发现如果在文件对话框中单击取消,funct
我有代码,仅在用户选择“另存为”时运行。为此并获取我正在使用的文件的新名称 Application.GetSaveAsFilename功能。 我遇到的问题是类型不匹配,同时检查用户是否在他没有这样做时
我的 UILocalNotification 有问题。 我正在用我的方法安排通知。 - (void) sendNewNoteLocalReminder:(NSDate *)date alrt:(NS
祝你有美好的一天 我有一个网站,其中有很多“工具提示”。这些工具提示是在将鼠标悬停在文本的特定部分上时创建的。工具提示是一个 div block ,它显示在网站上所有其他内容的顶部,并且当光标从文本移
我遇到以下问题。每隔 2 秒,程序就会进入 if 语句。在这个 if 语句中,我想要一个计时器,它会在 15 秒后给我一条消息。计时器应延迟 1 秒运行。但是当我用计时器“等待”时,if 语句将再执行
基本上我有以下代码片段, (let [task (FutureTask. fn) thr (Thread. task)] (.start thr) ;;wait for signa
取消正在进行的 ASIHttpRequest 请求的正确位置在哪里?这就是我取消的方式,但是当我 时它继续崩溃在不让请求完成的情况下从一个 View Controller 转移到另一个 View Co
我在我的 winforms 应用程序中使用 BackgroundWorker 来执行另一个类中发生的长时间运行的任务(执行数据库操作)。由于所有工作都是在另一个类中完成的,因此取消并不那么简单。我在另
我正在使用 OneSignal 向我的用户显示通知。通知工作正常,但我注意到,如果我在通知栏中“滑动”取消通知,则通知将永远保留,这是一张显示应用程序图标上的通知的图像,我想在应用程序已打开: 我看到
正在运行的 AsyncTask 的 .cancel(boolean) 方法如何工作?这是文档: Attempts to cancel execution of this task. This atte
我注意到,当我激活约束时,我会立即在该行代码处收到一条警告,指出不能同时满足约束。 我假设布局是在“UI 更新周期”之类的稍后时间点计算的,而不是每次约束都被(取消)激活。因此,在(取消)激活约束的代
这是我创建线程的方式: readFromWebThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadThread:
我目前正在尝试取消与我的数据模型中的对象关联的特定 UILocalNotifications。为此,每个数据对象都有一个唯一标识符,即 NSUUID。 创建 UILocalNotification:
当我提交并单击“确定”时,它会继续,但当我按“取消”时,它仍然会提交。我尝试使用此代码,但提交和取消按钮仍然执行相同的操作。 model.saveForm = function() { var
我有一个警报弹出窗口,当发生特定操作时会出现该弹出窗口。 5 秒后,使用 setTimeout() 隐藏警报弹出窗口。 我遇到的问题是,如果我多次触发弹出窗口,有时后续的弹出窗口会出现但立即消失。我相
我有一些 javascipt (jQuery),其中单击按钮时会淡入 #myDiv,然后使用超时函数在 5 秒后再次淡出。它工作正常,但如果用户在超时内的 fadeOut 函数运行之前再次单击该按钮,
我是一名优秀的程序员,十分优秀!