linux pause函数的一点小探索
2019独角兽企业重金招聘Python工程师标准>>>
之前有人问我一个问题,如果做一个处理某种类型的事情的东西,让它长期运行不退出,应该怎么做?(这不就是任务队列处理器么)
不管三七二十一,为了装逼先忽悠一个版本上去:
while(true){//do something
}
这样不就行了。
但是丢系统里面,看到CPU空转,浪费资源也是很蛋碎。改吧:
while(true){if(empty(task_list)){pause();}else{//do something;}
}
又有问题了,你这不行啊,空队列之后,该如何唤醒进程呢?擦,这pause好像我也不熟悉,先去看两下。
哦,原来要注册信号处理函数才行。那继续改
void my_fun()
{printf("this is fun!\n");
}int main()
{signal(SIGUSR1,my_fun);while(true){if(empty(task_list)){pause();}else{//do something;}}
}
好像是可以了,只要有任务到来,叫任务接收进程发个SIGUSR1信号过来就行了。但是总觉得有点怪怪的,我只是想继续而已,连那个处理信号的函数好像没啥鸟用。(也许是我思路有问题)
然后又复习了下,信号处理的部分,好像我可以给这里改成使用STOP的方式
int main()
{while(true){if(empty(task_list)){raise(SIGSTOP);}else{//do something;}}
}
任务到来就发SIGCONT继续。
但是还是觉得有问题,进程S状态和T状态对待信号到来的方式有所不同:
Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态。
Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。
S状态的时候,可以接受比较多的信号,从而更灵活的处理信号;
T状态下,除了SIGCONT,其他信号是滴水不进的(不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。)
查看linux下的大多数进程,大部分都是S状态的,基本看不到T状态下的进程。平常我们Ctrl+Z就是发送STOP信号,暂停进程,这个pause也是暂停进程,他们都是把进程挂起放到外存中,除了对信号处理有分别之外,还有其他分别么?
所以目前得到的结论就是,这两种状态只是信号处理上有区别,根据进程三态模型看,本质上都是把进程挂起了。
转载于:https://my.oschina.net/zwyang/blog/1784746
linux pause函数的一点小探索相关推荐
- Linux pause函数 详解
int pause(void); 作用:使调用进程(线程)进入休眠状态(就是挂起):直到接收到信号且信号函数成功返回 pause函数才会返回 返回值:始终返回-1 示例代码: #include < ...
- Linux pause函数
文章目录 pause函数 pause函数 int pause(void); 功能:一旦执行进程就会进入无限的休眠(暂停),直到遇到信号. 示例: #include <stdio.h> #i ...
- 关于preg_match() / preg_replace()函数的一点小说明
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $ ...
- notion函数_【notion】关于进度管理-时间函数的一点小心得
大家好,作为b站深海潜水选手近期入了notion这个丝滑般触感的软件,也看了几个b站里notion大佬的视频,结合了自己的需要把workspace整理了一下. 具体如何建立属于自己的workspace ...
- librosa能量_librosa中mfcc函数的一点小问题
(图摄于阿姆斯特丹梵高博物馆) 在重读<解析深度学习:语音识别实践>中,发现有段文字跟我预想的并不太一样: 在我的印象中,mfcc的维度应该和梅尔滤波器组数是一样的:stft-&a ...
- 函数的傅立叶展开掐死我吧_关于文章《傅里叶分析之掐死教程》的再一点小思考...
封火星:关于文章<傅里叶分析之掐死教程>的一点小思考zhuanlan.zhihu.com 以前的文章,从原理上更好的理解了原文中的一点,不过因为公式不是完全一样,从而有一个新问题不能解决 ...
- linux sleep alarm,Linux环境编程之信号处理(三、利用alarm()和pause()函数实现sleep()函数)...
sleep()是执行挂起一段时间,而alarm()函数是定时器,pause()函数则是挂起进程,当出现信号打断时,才会继续往前执行: 先来分享下alarm()函数,alarm()函数用来设置一个定时器 ...
- Linux系统编程----8(竞态条件,时序竞态,pause函数,如何解决时序竞态)
竞态条件(时序竞态): pause 函数 调用该函数可以造成进程主动挂起,等待信号唤醒.调用该系统调用的进程将处于阻塞状态(主动放弃 cpu) 直 到有信号递达将其唤醒,等不到一直等 int paus ...
- linux中的信号3——alarm、pause函数
以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 1.alarm函数 内核以API形式提供的闹钟: 可以为当前进程定义闹钟,时间到了会发出SIGALRM信号. 每个进程 ...
最新文章
- Data Geekery发布了Java ORM工具jOOQ的3.9.0版,用于构建类型安全查询
- 《构建之法》阅读笔记2
- JAVA调用SQL存储过程详解
- JAVA学习笔记--初始化与清理
- 计算机网络自顶向下方法【七】——链路层
- kali用x-shell连接_良心国产工具,比Xshell好用还免费!
- 担当大任者的九大特征
- 链表的一些leetcode题目+python(c++)
- jupyter问题: failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
- navacat无法打开excel解决
- 二倍图三倍图什么意思_香港读研,图什么?
- JavaScript 的 defer 与 async
- 面试前,不要这么准备了,简直愚蠢到极点
- 算法:判断树是否相同100. Same Tree
- mysql使用sql脚本建立数据库
- word文档怎么压缩,word文档压缩方法
- 2020国家网络安全宣传周,这些事和你有关
- 区块链3+1:2018区块链媒体趣味花名册
- 移动端 - Android客户端性能测试常见指标
- BPR英文及中文全称
热门文章
- 识别图片并可视化_数据可视化3大发展方向
- tcpdump 不显示指定ip_wordpress首页不显示指定分类文章的方法
- python编程从入门到精通实践_《Python编程:从入门到实践》总结_Day01
- python复杂代码示例_6 个例子教你重构 Python 代码
- java 文件无法下载_无法从Java中的URL下载文件
- left join on or 优化_pandas中merge/join有什么区别?
- mysql explain ref列_mysql explain中的列
- 添加ejs后页面空白解决办法
- mysql数据类型选择_MySQL学习笔记(二):MySQL数据类型汇总及选择参考
- java name_Java枚举name()方法及示例