0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux如何以暂停状态启动新进程

xCb1_yikoulinux 来源:程序员写个解 作者:吴解君 2022-04-15 12:25 次阅读

引言

上星期新加一好友,在好友的朋友圈动态里看到一张聊天截图,是署名为“阅码场”的Linux内核技术交流群, 群友提问:

“请教一个Bash的问题:有没有什么办法让一个新开的进程,一开始就处于暂停状态,直到我输入fg?”

巧了,上星期我在尝试使用ftrace根据进程号(PID)过滤、跟踪内核执行过程时,迫切需要一个 进程启动后处于暂停状态 ,与这位群友一样,也是满世界寻找Bash是否有内置类似该功能,为什么我需要它呢?

倘若一个应用程序是死循环,或者执行时间相对较旧,哪怕只执行1秒,我Left Golden Finger完全可以输入 “Ctrl+Z” 暂停它,借助pidof获取进程的PID号,将其填入set_ftrace_pid仅过滤该进程信息,输入 “fg” 恢复进程执行。

再看另一个应用场景,若某个进程执行耗时很短呢?例如“echo”命令转瞬即逝,完全没有反应的机会。

再举例,倘若我就想抓取从应用程序开始执行到“Ctrl+Z”之间几百毫秒的内核执行过程,我又该怎么?

“拿到源码重新编译,在main函数开始时添加足够的延时。”头上长尖角的小人说。

“耍流氓!无耻!偷换概念!”头上另一个长翅膀小人指责。

好吧,别辩论了,回归正题。

既然群友都和我一样没能找到Bash内置实现,再怎么说“阅码场”聊天群也是人类高质量码农的聚集地,我相信他也不是伸手党。那么是时候造车子了,写几行代码实现这个功能,没骗你,真几行,发个信号而已。

怎么做

先贴代码再解释。

67c86950-bbe9-11ec-aa7f-dac502259ad0.png

首先要了解系统快捷键Ctrl+Z以及命令fg本质是做了什么,Ctrl+Z是向前端应用发送 SIGSTOP信号 ,fg恢复最近一个被暂停的应用发送 SIGCONT信号 ,并放到前台来执行。

SIGSTOP对应信号19、SIGCONT对应信号18,正如代码23行和31行所做的那样。你不相信,那就用API signal()去截获这两个信号的处理函数。

既然是信号触发,那就能用kill命令去替代Ctrl+Z和fg动作:

kill -19

kill -18

命令输入 “kill -l” 可查阅到所有信号。

67d54724-bbe9-11ec-aa7f-dac502259ad0.png

写个测试程序

写另外一个测试程序child.c,仅打印进程的PID号,以及调试主进程是否能成功传递参数给子进程。

67ea1d70-bbe9-11ec-aa7f-dac502259ad0.png

文稿贴的两张图是测试的方法,主进程传递给子进程3个参数“aa bb cc”,刚启动后子进程被信号暂停(T),左侧输入回车后子进程得以运行(S)。

67ffdc6e-bbe9-11ec-aa7f-dac502259ad0.png

6819b134-bbe9-11ec-aa7f-dac502259ad0.png

使用新轮子

恩,轮子造好了,看看它的效果怎么样,用它协助ftrace抓取echo的执行。

思考

现在左边窗口输入./master.elf echo abcdefg,切换到右侧窗口输入脚本ftrace-pid.sh,这个脚本将抓取1秒的数据,再切换到左侧窗口按Enter键。打开trace文件/tmp/a.txt,怎么样了,echo命令的执行信息被抓取下来了。

68398bb2-bbe9-11ec-aa7f-dac502259ad0.png

实验里用到的ftrace-pid.sh脚本我把他的源码贴在下面。

685cc276-bbe9-11ec-aa7f-dac502259ad0.png

思考

我在使用kill发送信号时有个疑问,既然应用程序收到SIGSTOP信号后就处于停止状态,既然停止了,为什么还能处理之后的SIGCONT信号呢?之前是进程可运行,才能被调度、能处理信号,很好理解。之后进程都停止了,又怎么能处理SIGCONT信号恢复执行呢?你能够用鼠标点击左下角“开始”菜单关闭计算机,却无法继续用鼠标使其开机。所以我猜测信号处理首先是由于调度器处理的。

第二个扩展问题,gdb调试应用程序是可以暂停应用程序执行的,它使用的是ptrace。你能否写一个应用程序,它利用ptrace原理去暂停子进程执行。我说的暂停位置可不是main,甚至在main之前。应用程序启动时 “第一个系统调用是什么?” 尝试找到它,并截获。

原文标题:仅40行代码,Linux如何以暂停状态启动新进程,当然是发送信号呀

文章出处:【微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10974

    浏览量

    206669
  • 代码
    +关注

    关注

    30

    文章

    4552

    浏览量

    66640
  • 应用程序
    +关注

    关注

    37

    文章

    3126

    浏览量

    56307

原文标题:仅40行代码,Linux如何以暂停状态启动新进程,当然是发送信号呀

文章出处:【微信号:yikoulinux,微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux系统下进程的几种状态介绍

    文章对 Linux 系统下进程的几种状态进行介绍,并对系统出现大量僵尸进程和不可中断进程的场景进行分析,使用常用的几种工具进行问题分析定位。
    发表于 11-24 16:15 9876次阅读
    <b class='flag-5'>Linux</b>系统下<b class='flag-5'>进程</b>的几种<b class='flag-5'>状态</b>介绍

    Linux学习杂谈】之进程状态

    是否满足,而深度睡眠是不能被唤醒的,只有等待到相应的条件到达,才能够结束睡眠状态。5.停止态 停止态就是表明进程暂停了,这个是很好理解的,就跟我们播放电影一样,可以先暂停,然后继续播
    发表于 09-27 00:36

    Linux下的进程结构

    、所接收的信号信息等。 下面详细讲解task_struct结构中最为重要的两个域:state(进程状态)和pid(进程标识符)。 1)进程状态
    发表于 05-27 09:24

    Linux系统中PCB如何创建新进程

    PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时,如何来建立一个新的PCB的这一个过程来进行分析,在Linux系统中,PCB主要是存储在一个叫做task_struct这一个结构体中,创建
    发表于 08-05 07:58

    Linux内核创建新进程的过程分析

    PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时,如何来建立一个新的PCB的这一个过程来进行分析,在Linux系统中,PCB主要是存储在一个叫做task_struct这一个结构体中,创建
    发表于 08-08 08:42

    linux系统进程存在状态及管理

    linux系统进程存在状态及管理详解
    发表于 05-21 06:28

    如何理解ARM中的进程

    的结构体来表示,定义在include/linux/sched.h中,每当创建一新进程时,便在内存中申请一个空的task_struct结构,填入所需信息,同时,指向该结构的指针也被加入到task数组中,所有
    发表于 10-23 16:02

    Linux进程管理

    Linux进程管理 本章主要介绍进程的概念、状态、构成以及Linux进程的相关知识。 掌握
    发表于 04-28 14:57 0次下载

    Linux进程控制编程

    7.2 Linux进程控制编程 1.fork() 在Linux中创建一个新进程的惟一方法是使用fork()函数。fork()函数是Linux
    发表于 10-18 14:16 0次下载

    Linux守护进程详解

    较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导载入时启动,在系统关闭时终止。Linux有很多系统服务,大多数服务都是通过守护
    发表于 10-18 14:24 0次下载
    <b class='flag-5'>Linux</b>守护<b class='flag-5'>进程</b>详解

    Linux 进程状态浅析

    一个或多个进程linux内核需要对这些进程进行管理,以使它们在系统中“同时”运行。linux内核对进程的这种管理分两个方面:
    发表于 04-02 14:40 218次阅读

    关于Linux进程你所需要知道的一切

    类型,它们在系统启动启动,并作为服务一直运行;它们不会死亡。它们自发地作为系统任务启动(作为服务运行)。但是,它们能被用户通过 init 进程控制。
    发表于 04-02 14:47 288次阅读

    linux内核启动过程会执行用户空间的init进程

    linux内核启动过程的后期,在kernel_init()函数代表的init线程中,会尝试执行用户空间的init进程
    的头像 发表于 10-14 09:12 744次阅读

    深度剖析Linux进程控制(上)

    Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程新进程为子进程,而原进程
    的头像 发表于 05-12 10:49 319次阅读
    深度剖析<b class='flag-5'>Linux</b>中<b class='flag-5'>进程</b>控制(上)

    深度剖析Linux进程控制(下)

    Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程新进程为子进程,而原进程
    的头像 发表于 05-12 10:49 320次阅读
    深度剖析<b class='flag-5'>Linux</b>中<b class='flag-5'>进程</b>控制(下)