作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在做一个利用线程的程序。我还有一个 SIGINT
处理程序,可以正确关闭所有内容,以便有序关闭。但是,由于我的线程处于 while(1)
循环中,我的处理程序中的 pthread_join
函数卡住了,我必须按 ctrl+c
很多次,单独关闭每个线程。我怎样才能一键做到这一点?这是我的线程工作函数:
void *worker(){
struct message msg;
while(1){
if(wr.fnode != NULL){
sem_wait(&tsem);
stats->nptri++;
msg.patient = *(wr.fnode);
wr_deletefnode();
sem_post(&tsem);
sleep((float)(msg.patient.ttime/1000));
msgsnd(mqid,&msg,sizeof(msg)-sizeof(long),0);
}
}
}
最佳答案
这取决于您如何将信号
(SIGINT 或任何)发送到线程
。要向线程发送信号,您应该使用 pthread_kill()
而不是 kill()
或 raise()
因为信号处理程序(signal或 sigaction
) 只处理进程
,不处理线程
。
int pthread_kill(pthread_t thread, int sig);
如果您曾尝试使用 kill 命令/函数来终止正在运行的线程,操作系统将发出类似 Warning: Program '/bin/bash' crashed 的警告。
使用 ps -eL | 观察正在运行的线程 | grep pts/0
发送信号前后。
希望你有所收获。
关于c - 提高 SIGINT,但卡在 c 中的线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47735756/
我是一名优秀的程序员,十分优秀!