linux下 如何用信号signal 终止或者暂停子线程,linux下实现线程暂停

记得在windows下有一个SuspendThread使线程挂起的函数,却发现linux下没有类似的函数,于是想自己写个。。

刚开始就想到用信号(没办法,正在看auep,只能想到这个)

test1:

用pthread_kill将SIGSTOP信号发送到要暂停的线程

期望结果:线程暂停

实际结果:进程暂停

结论:oh, shit,查了查书·信号是进程范围的,还有SIGSTOP是无法捕获的,失败·

于是,又想了个方法:

test2:

还有用信号,不过这次改用自定义的SIGUSR1(用于挂起)和SIGUSR2(用于唤醒)

在SIGUSR1处理函数中等待SIGUSR2信号就好了呀··

但问题就来了,书上信号是进程范围的,按照我的理解现进程中的所有线程应该都被挂起才是,

要是把处理函数中阻塞在这··,这程序不是不能跑了·

结论:想想都觉得不可能,所以就放弃了

接下来就是一番baidu,google,终于在一个论坛找到了(地址忘了),想法跟上面test2的基本一致,接下来就是依葫芦画瓢了,

有了下面的小程序,有问题希望不吝指出!!

总结:一、对signal的处理还不是很理解

1、signal是在接收的线程执行处理函数,不影响其它线程?

二、不要轻易放弃自己的想法,不要过早认定“这不可能的,绝对地”

三、东西不是think出来的,是do出来 的,有了想法就去do

问题:1、很多函数不是异步信号安全的,所以这样做基本无意义···,汗··

#include

#include

#include

#include

#define SIGRESUME SIGUSR2

#define SIGSUSPEND SIGUSR1

/* Thread specied var, the status*/

static __thread int g_bSuspend;

void* task1(void *param)

{

while(1)

{

printf("***************************\n");

sleep(1);

}

}

void* task2(void *param)

{

while(1)

{

printf("##############################\n");

sleep(2);

}

}

void suspend_handler(int signum)

{

g_bSuspend = 1;

sigset_t nset;

pthread_sigmask(0, NULL, &nset);

/* make sure that the resume is not blocked*/

sigdelset(&nset, SIGRESUME);

while(g_bSuspend) sigsuspend(&nset);

}

void resume_handler(int signum)

{

g_bSuspend = 0;

}

int suspend( pthread_t thread)

{

return pthread_kill( thread, SIGSUSPEND);

}

int resume( pthread_t thread)

{

return pthread_kill (thread, SIGRESUME);

}

int main()

{

struct sigaction suspendsa = {0};

struct sigaction resumesa = {0};

suspendsa.sa_handler = suspend_handler;

sigaddset(&suspendsa.sa_mask, SIGRESUME);

sigaction( SIGSUSPEND, &suspendsa, NULL);

resumesa.sa_handler = resume_handler;

sigaddset(&resumesa.sa_mask, SIGSUSPEND);

sigaction( SIGRESUME, &resumesa, NULL);

pthread_t runTh1;

pthread_t runTh2;

pthread_create(&runTh1, NULL, task1, NULL);

pthread_create(&runTh2, NULL, task2, NULL);

while( 1 )

{

getchar();

suspend( runTh1);

suspend( runTh2);

//sleep(5);

resume( runTh1);

sleep(5);

resume( runTh2);

}

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

keil debug如何在watch直接修改变量值_python日志记录系列教程,内置logging模块(一),直接使用logging模块的基础日志记录

前言:成熟的软件开发不可避免的要进行日志记录,python内置模块logging提供了强大的日志记录能力,本文将从多个角度,由浅入深的介绍logging的常见使用方法和一些基本概念,本此系列文章分为两篇,本文为系列文…

linux进程管理子系统分析,linux进程管理子系统简要分析

Linux进程管理:进程与程序:程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体。进程:是一个执行中的程序,它是动态的实体进程四要素:1. 有一段程序供其执行,这段程…

基于python的分布式扫描器_基于python的服务器监测系统的设计

基于python的服务器监测系统的设计高正;徐浩;余曼【期刊名称】《电脑知识与技术》【年(卷),期】2017(013)002【摘要】本文介绍了一种基于Python的服务器监测系统的设计,系统部署在需要监测的服务器上能够实时监测服务器的CPU、内存、磁盘空间.每天定时(可人工设置)自动发邮件报…

c语言变量命名规则_带你学习C语言—变量

在编写程序时,常常需要将数据存储在内存中,以便于使用这个数据或者修改这个数据的值。我们通常使用变量来存储数据,而且使用变量可以引用存储在内存中的数据,并随时根据需要对数据进行处理。变量的概念在程序设计中,允…

linux某个线程信号唤醒,linux多线程编程--信号量和条件变量 唤醒丢失事件

PriorityQueue有一个特征需要特别注意,即:对于那些通过排序方法判定为“相等”的元素,在通过poll方法依次取出它们时,它们的顺序是不确定的,特别是不会维持插入的顺序。举例说明:假如一个对象Obj&#xff0…

qt布局嵌套_QDockWidget嵌套布局详解-实现Visual Studio布局

概述许多工程软件,如Qt Creator,VS,matlab等,都是使用dock布局窗口,这样用户可以自定义界面,自由组合窗口。Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定&…

ios 贝塞尔曲线 颜色填充_iOS贝塞尔曲线(UIBezierPath)的基本使用方法

简介UIBezierPath是对Core Graphics框架的一个封装,使用UIBezierPath类我们可以画出圆形(弧线)或者多边形(比如:矩形)等形状,所以在画复杂图形的时候会经常用到。分析首先我们先看一下,UIBezierPath有哪些重要的属性:1…

html缩进快捷键_Windows IDEA 快捷键终极大全,果断收藏!

作者:JaJian出处:https://www.cnblogs.com/jajian/p/8012603.html话说IDEA对新手来说难,可能其中一个原因就是快捷键组合多而且复杂但是它也很全,基本所有功能都可以通过快捷键来完成,可以这么说,如果你掌握…

linux远程登录 密钥,使用密钥认证机制远程登录Linux

密钥认证机制创建存放key的文件1)创建目录 /root/.ssh 并设置权限[rootlocalhost ~]# mkdir /root/.ssh mkdir 命令用来创建目录,以后会详细介绍,暂时只了解即可。[rootlocalhost ~]# chmod 700 /root/.ssh chmod 命令是用来修改文件属性权限的&#xff…

python的pyqt5_Pycharm+Python+PyQt5使用详解

1,打开cmd安装PyQt5pip install pyqt52,PyQt5不再提供Qt Designer等工具,所以需要再安装pyqt5-toolspip install pyqt5-tools3,打开Pycharm,进入设置,添加外部工具4,添加QtDesigner,…

安装quartus时弹出错误_Win10 安装arcgis10.2 for desktop需要.net framework 解决方案

有效解决“Win10 安装arcgis10.2 for desktop需要microsoft.net framework 3.5 sp1或等效环境”。台式电脑新装了系统,重新安装arcgis 10.2时弹出“安装arcgis10.2 for desktop需要microsoft.net framework 3.5 sp1或等效环境 ”。在网上百度了很多的相关知识&#…

Linux_ppc下软件包安装,Linux下软件包安装详解

一、概述现在Linux上软件的安装方式有多种,有源码包编译,软件包管理器,软件包管理器前端工具,通用二进制编译等。源码包,优点是,灵活性和可定制性比较好,缺点是,技术要求高&#xff…

部编版是什么版本_部编版是人教版吗

部编版是人教版吗2019-09-07 17:06:05文/陶凯月部编版不是人教版,部编版教材由教育部组织编写,而人教版即由人民教育出版社出版。下面是小编整理的内容,供大家参考。什么是部编版教材部编版教材由教育部组织编写,2016年&#xff0…

下面哪个字段是http请求中必须具备的_HTTP 协议报文结构及示例

HTTP 基本架构下面我们用一张简单的流程图来展示 HTTP 协议基本架构,以便大家先有个基本的了解Web Client 可以是浏览器、搜索引擎、机器人等等一切基于HTTP 协议发起 http 请求的工具。Web Server 可以是任何的能解析 HTTP 请求,并返回给Web Client 可识…

文件名为空linux,文件系统:隐匿在Linux背后的机制

原标题:文件系统:隐匿在Linux背后的机制在 Linux 中,最直观、最可见的部分就是 文件系统(file system) 。下面我们就来一起探讨一下关于 Linux 中国的文件系统,系统调用以及文件系统实现背后的原理和思想。这些思想中有一些来源于…

xshell怎么让程序后台运行_使程序在Linux下后台运行

我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。所以使程序在后台跑有以下三个好处:1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那样,我们这网络一断…

docker安装elasticsearch_Elasticsearch amp; Kibana 部署安装 (Docker)

为什么要使用 Docker来部署 Elasticsearch 和 Kibana 呢,传统使用软件在操作系统上安装和配置的方法过于繁琐,并且受一些跨平台的约束,例如Mac、Windows、Linux等,所以无论安装什么软件,通过 Docker 进行部署是最为简单…

linux 多域名访问数据库,Linux下虚拟域名的实现

目前Linux操作系统十分火爆,所以很多朋友希望了解一下Linux下虚拟域名的实现过程。下面就基于目前比较流行的RedHat来讨论一下。一、DNS服务器的设置我们知道互联网网是基于TCP/IP协议的,要进行通信必须获得对方的IP地址,这是通过DNS服务器来…

mfc 对话框透明 控件不透明_你不知道的丨透明胶用法

家家都有的透明胶带,而它的作用不仅仅是用来粘东西。别看它是这么小小一块,可是作用却很多。平时我们穿的衣服,裤子难免会粘上些毛。在我们紧急出门的时候,突然发现衣服粘有毛,这时候我们的透明胶就派上用场了。用透明…

sscanf取固定长度的int_sscanf函数用法详解-阿里云开发者社区

函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源…