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函数的一点小探索相关推荐

  1. Linux pause函数 详解

    int pause(void); 作用:使调用进程(线程)进入休眠状态(就是挂起):直到接收到信号且信号函数成功返回 pause函数才会返回 返回值:始终返回-1 示例代码: #include < ...

  2. Linux pause函数

    文章目录 pause函数 pause函数 int pause(void); 功能:一旦执行进程就会进入无限的休眠(暂停),直到遇到信号. 示例: #include <stdio.h> #i ...

  3. 关于preg_match() / preg_replace()函数的一点小说明

    int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $ ...

  4. notion函数_【notion】关于进度管理-时间函数的一点小心得

    大家好,作为b站深海潜水选手近期入了notion这个丝滑般触感的软件,也看了几个b站里notion大佬的视频,结合了自己的需要把workspace整理了一下. 具体如何建立属于自己的workspace ...

  5. librosa能量_librosa中mfcc函数的一点小问题

    (图摄于阿姆斯特丹梵高博物馆) 在重读<解析深度学习:语音识别实践>中,发现有段文字跟我预想的并不太一样: 在我的印象中,mfcc的维度应该和梅尔滤波器组数是一样的:stft-&a ...

  6. 函数的傅立叶展开掐死我吧_关于文章《傅里叶分析之掐死教程》的再一点小思考...

    封火星:关于文章<傅里叶分析之掐死教程>的一点小思考​zhuanlan.zhihu.com 以前的文章,从原理上更好的理解了原文中的一点,不过因为公式不是完全一样,从而有一个新问题不能解决 ...

  7. linux sleep alarm,Linux环境编程之信号处理(三、利用alarm()和pause()函数实现sleep()函数)...

    sleep()是执行挂起一段时间,而alarm()函数是定时器,pause()函数则是挂起进程,当出现信号打断时,才会继续往前执行: 先来分享下alarm()函数,alarm()函数用来设置一个定时器 ...

  8. Linux系统编程----8(竞态条件,时序竞态,pause函数,如何解决时序竞态)

    竞态条件(时序竞态): pause 函数 调用该函数可以造成进程主动挂起,等待信号唤醒.调用该系统调用的进程将处于阻塞状态(主动放弃 cpu) 直 到有信号递达将其唤醒,等不到一直等 int paus ...

  9. linux中的信号3——alarm、pause函数

    以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 1.alarm函数 内核以API形式提供的闹钟: 可以为当前进程定义闹钟,时间到了会发出SIGALRM信号. 每个进程 ...

最新文章

  1. Data Geekery发布了Java ORM工具jOOQ的3.9.0版,用于构建类型安全查询
  2. 《构建之法》阅读笔记2
  3. JAVA调用SQL存储过程详解
  4. JAVA学习笔记--初始化与清理
  5. 计算机网络自顶向下方法【七】——链路层
  6. kali用x-shell连接_良心国产工具,比Xshell好用还免费!
  7. 担当大任者的九大特征
  8. 链表的一些leetcode题目+python(c++)
  9. jupyter问题: failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
  10. navacat无法打开excel解决
  11. 二倍图三倍图什么意思_香港读研,图什么?
  12. JavaScript 的 defer 与 async
  13. 面试前,不要这么准备了,简直愚蠢到极点
  14. 算法:判断树是否相同100. Same Tree
  15. mysql使用sql脚本建立数据库
  16. word文档怎么压缩,word文档压缩方法
  17. 2020国家网络安全宣传周,这些事和你有关
  18. 区块链3+1:2018区块链媒体趣味花名册
  19. 移动端 - Android客户端性能测试常见指标
  20. BPR英文及中文全称

热门文章

  1. 识别图片并可视化_数据可视化3大发展方向
  2. tcpdump 不显示指定ip_wordpress首页不显示指定分类文章的方法
  3. python编程从入门到精通实践_《Python编程:从入门到实践》总结_Day01
  4. python复杂代码示例_6 个例子教你重构 Python 代码
  5. java 文件无法下载_无法从Java中的URL下载文件
  6. left join on or 优化_pandas中merge/join有什么区别?
  7. mysql explain ref列_mysql explain中的列
  8. 添加ejs后页面空白解决办法
  9. mysql数据类型选择_MySQL学习笔记(二):MySQL数据类型汇总及选择参考
  10. java name_Java枚举name()方法及示例