0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux如何以暫停狀態(tài)啟動(dòng)新進(jìn)程

xCb1_yikoulinux ? 來(lái)源:程序員寫(xiě)個(gè)解 ? 作者:吳解君 ? 2022-04-15 12:25 ? 次閱讀

引言

上星期新加一好友,在好友的朋友圈動(dòng)態(tài)里看到一張聊天截圖,是署名為“閱碼場(chǎng)”的Linux內(nèi)核技術(shù)交流群, 群友提問(wèn):

“請(qǐng)教一個(gè)Bash的問(wèn)題:有沒(méi)有什么辦法讓一個(gè)新開(kāi)的進(jìn)程,一開(kāi)始就處于暫停狀態(tài),直到我輸入fg?”

巧了,上星期我在嘗試使用ftrace根據(jù)進(jìn)程號(hào)(PID)過(guò)濾、跟蹤內(nèi)核執(zhí)行過(guò)程時(shí),迫切需要一個(gè) 進(jìn)程啟動(dòng)后處于暫停狀態(tài) ,與這位群友一樣,也是滿(mǎn)世界尋找Bash是否有內(nèi)置類(lèi)似該功能,為什么我需要它呢?

倘若一個(gè)應(yīng)用程序是死循環(huán),或者執(zhí)行時(shí)間相對(duì)較舊,哪怕只執(zhí)行1秒,我Left Golden Finger完全可以輸入 “Ctrl+Z” 暫停它,借助pidof獲取進(jìn)程的PID號(hào),將其填入set_ftrace_pid僅過(guò)濾該進(jìn)程信息,輸入 “fg” 恢復(fù)進(jìn)程執(zhí)行。

再看另一個(gè)應(yīng)用場(chǎng)景,若某個(gè)進(jìn)程執(zhí)行耗時(shí)很短呢?例如“echo”命令轉(zhuǎn)瞬即逝,完全沒(méi)有反應(yīng)的機(jī)會(huì)。

再舉例,倘若我就想抓取從應(yīng)用程序開(kāi)始執(zhí)行到“Ctrl+Z”之間幾百毫秒的內(nèi)核執(zhí)行過(guò)程,我又該怎么?

“拿到源碼重新編譯,在main函數(shù)開(kāi)始時(shí)添加足夠的延時(shí)?!鳖^上長(zhǎng)尖角的小人說(shuō)。

“耍流氓!無(wú)恥!偷換概念!”頭上另一個(gè)長(zhǎng)翅膀小人指責(zé)。

好吧,別辯論了,回歸正題。

既然群友都和我一樣沒(méi)能找到Bash內(nèi)置實(shí)現(xiàn),再怎么說(shuō)“閱碼場(chǎng)”聊天群也是人類(lèi)高質(zhì)量碼農(nóng)的聚集地,我相信他也不是伸手黨。那么是時(shí)候造車(chē)子了,寫(xiě)幾行代碼實(shí)現(xiàn)這個(gè)功能,沒(méi)騙你,真幾行,發(fā)個(gè)信號(hào)而已。

怎么做

先貼代碼再解釋。

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

首先要了解系統(tǒng)快捷鍵Ctrl+Z以及命令fg本質(zhì)是做了什么,Ctrl+Z是向前端應(yīng)用發(fā)送 SIGSTOP信號(hào) ,fg恢復(fù)最近一個(gè)被暫停的應(yīng)用發(fā)送 SIGCONT信號(hào) ,并放到前臺(tái)來(lái)執(zhí)行。

SIGSTOP對(duì)應(yīng)信號(hào)19、SIGCONT對(duì)應(yīng)信號(hào)18,正如代碼23行和31行所做的那樣。你不相信,那就用API signal()去截獲這兩個(gè)信號(hào)的處理函數(shù)。

既然是信號(hào)觸發(fā),那就能用kill命令去替代Ctrl+Z和fg動(dòng)作:

kill -19

kill -18

命令輸入 “kill -l” 可查閱到所有信號(hào)。

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

寫(xiě)個(gè)測(cè)試程序

寫(xiě)另外一個(gè)測(cè)試程序child.c,僅打印進(jìn)程的PID號(hào),以及調(diào)試主進(jìn)程是否能成功傳遞參數(shù)給子進(jìn)程。

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

文稿貼的兩張圖是測(cè)試的方法,主進(jìn)程傳遞給子進(jìn)程3個(gè)參數(shù)“aa bb cc”,剛啟動(dòng)后子進(jìn)程被信號(hào)暫停(T),左側(cè)輸入回車(chē)后子進(jìn)程得以運(yùn)行(S)。

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

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

使用新輪子

恩,輪子造好了,看看它的效果怎么樣,用它協(xié)助ftrace抓取echo的執(zhí)行。

思考

現(xiàn)在左邊窗口輸入./master.elf echo abcdefg,切換到右側(cè)窗口輸入腳本ftrace-pid.sh,這個(gè)腳本將抓取1秒的數(shù)據(jù),再切換到左側(cè)窗口按Enter鍵。打開(kāi)trace文件/tmp/a.txt,怎么樣了,echo命令的執(zhí)行信息被抓取下來(lái)了。

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

實(shí)驗(yàn)里用到的ftrace-pid.sh腳本我把他的源碼貼在下面。

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

思考

我在使用kill發(fā)送信號(hào)時(shí)有個(gè)疑問(wèn),既然應(yīng)用程序收到SIGSTOP信號(hào)后就處于停止?fàn)顟B(tài),既然停止了,為什么還能處理之后的SIGCONT信號(hào)呢?之前是進(jìn)程可運(yùn)行,才能被調(diào)度、能處理信號(hào),很好理解。之后進(jìn)程都停止了,又怎么能處理SIGCONT信號(hào)恢復(fù)執(zhí)行呢?你能夠用鼠標(biāo)點(diǎn)擊左下角“開(kāi)始”菜單關(guān)閉計(jì)算機(jī),卻無(wú)法繼續(xù)用鼠標(biāo)使其開(kāi)機(jī)。所以我猜測(cè)信號(hào)處理首先是由于調(diào)度器處理的。

第二個(gè)擴(kuò)展問(wèn)題,gdb調(diào)試應(yīng)用程序是可以暫停應(yīng)用程序執(zhí)行的,它使用的是ptrace。你能否寫(xiě)一個(gè)應(yīng)用程序,它利用ptrace原理去暫停子進(jìn)程執(zhí)行。我說(shuō)的暫停位置可不是main,甚至在main之前。應(yīng)用程序啟動(dòng)時(shí) “第一個(gè)系統(tǒng)調(diào)用是什么?” 嘗試找到它,并截獲。

原文標(biāo)題:僅40行代碼,Linux如何以暫停狀態(tài)啟動(dòng)新進(jìn)程,當(dāng)然是發(fā)送信號(hào)呀

文章出處:【微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11161

    瀏覽量

    208467
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4694

    瀏覽量

    68078
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3221

    瀏覽量

    57502

原文標(biāo)題:僅40行代碼,Linux如何以暫停狀態(tài)啟動(dòng)新進(jìn)程,當(dāng)然是發(fā)送信號(hào)呀

文章出處:【微信號(hào):yikoulinux,微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux系統(tǒng)下進(jìn)程的幾種狀態(tài)介紹

    文章對(duì) Linux 系統(tǒng)下進(jìn)程的幾種狀態(tài)進(jìn)行介紹,并對(duì)系統(tǒng)出現(xiàn)大量僵尸進(jìn)程和不可中斷進(jìn)程的場(chǎng)景進(jìn)行分析,使用常用的幾種工具進(jìn)行問(wèn)題分析定位。
    發(fā)表于 11-24 16:15 ?1.2w次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)下<b class='flag-5'>進(jìn)程</b>的幾種<b class='flag-5'>狀態(tài)</b>介紹

    Linux學(xué)習(xí)雜談】之進(jìn)程狀態(tài)

    是否滿(mǎn)足,而深度睡眠是不能被喚醒的,只有等待到相應(yīng)的條件到達(dá),才能夠結(jié)束睡眠狀態(tài)。5.停止態(tài) 停止態(tài)就是表明進(jìn)程暫停了,這個(gè)是很好理解的,就跟我們播放電影一樣,可以先暫停,然后繼續(xù)播
    發(fā)表于 09-27 00:36

    Linux下的進(jìn)程結(jié)構(gòu)

    、所接收的信號(hào)信息等。 下面詳細(xì)講解task_struct結(jié)構(gòu)中最為重要的兩個(gè)域:state(進(jìn)程狀態(tài))和pid(進(jìn)程標(biāo)識(shí)符)。 1)進(jìn)程狀態(tài)
    發(fā)表于 05-27 09:24

    Linux系統(tǒng)中PCB如何創(chuàng)建新進(jìn)程

    PCB包含了一個(gè)進(jìn)程的重要運(yùn)行信息,所以我們將圍繞在創(chuàng)建一個(gè)新進(jìn)程時(shí),如何來(lái)建立一個(gè)新的PCB的這一個(gè)過(guò)程來(lái)進(jìn)行分析,在Linux系統(tǒng)中,PCB主要是存儲(chǔ)在一個(gè)叫做task_struct這一個(gè)結(jié)構(gòu)體中,創(chuàng)建
    發(fā)表于 08-05 07:58

    Linux內(nèi)核創(chuàng)建新進(jìn)程的過(guò)程分析

    PCB包含了一個(gè)進(jìn)程的重要運(yùn)行信息,所以我們將圍繞在創(chuàng)建一個(gè)新進(jìn)程時(shí),如何來(lái)建立一個(gè)新的PCB的這一個(gè)過(guò)程來(lái)進(jìn)行分析,在Linux系統(tǒng)中,PCB主要是存儲(chǔ)在一個(gè)叫做task_struct這一個(gè)結(jié)構(gòu)體中,創(chuàng)建
    發(fā)表于 08-08 08:42

    linux系統(tǒng)進(jìn)程存在狀態(tài)及管理

    linux系統(tǒng)進(jìn)程存在狀態(tài)及管理詳解
    發(fā)表于 05-21 06:28

    Linux進(jìn)程管理

    Linux進(jìn)程管理 本章主要介紹進(jìn)程的概念、狀態(tài)、構(gòu)成以及Linux進(jìn)程的相關(guān)知識(shí)。 掌握
    發(fā)表于 04-28 14:57 ?0次下載

    Linux進(jìn)程控制編程

    7.2 Linux進(jìn)程控制編程 1.fork() 在Linux中創(chuàng)建一個(gè)新進(jìn)程的惟一方法是使用fork()函數(shù)。fork()函數(shù)是Linux
    發(fā)表于 10-18 14:16 ?0次下載

    Linux守護(hù)進(jìn)程詳解

    較長(zhǎng)的進(jìn)程,通常獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程常常在系統(tǒng)引導(dǎo)載入時(shí)啟動(dòng),在系統(tǒng)關(guān)閉時(shí)終止。Linux有很多系統(tǒng)服務(wù),大多數(shù)服務(wù)都是通過(guò)守護(hù)
    發(fā)表于 10-18 14:24 ?0次下載
    <b class='flag-5'>Linux</b>守護(hù)<b class='flag-5'>進(jìn)程</b>詳解

    最新Linux進(jìn)程凍結(jié)技術(shù)需要了解

    進(jìn)程凍結(jié)技術(shù)(freezing of tasks)是指在系統(tǒng)hibernate或者suspend的時(shí)候,將用戶(hù)進(jìn)程和部分內(nèi)核線(xiàn)程置于“可控”的暫停狀態(tài)。 2 為什么需要凍結(jié)技術(shù)
    發(fā)表于 05-06 16:00 ?752次閱讀

    Linux 進(jìn)程狀態(tài)淺析

    多個(gè)進(jìn)程。linux內(nèi)核需要對(duì)這些進(jìn)程進(jìn)行管理,以使它們?cè)谙到y(tǒng)中“同時(shí)”運(yùn)行。linux內(nèi)核對(duì)進(jìn)程的這種管理分兩個(gè)方面:
    發(fā)表于 04-02 14:40 ?271次閱讀

    linux進(jìn)程怎么查看

    Linux系統(tǒng)中,每個(gè)程序啟動(dòng)后可以創(chuàng)建一個(gè)或多個(gè)進(jìn)程。例如,提供Web服務(wù)的httpd程序,當(dāng)有大量用戶(hù)同時(shí)訪(fǎng)問(wèn)Web頁(yè)面時(shí),httpd程序可能會(huì)創(chuàng)建多個(gè)進(jìn)程來(lái)提供服務(wù)。
    發(fā)表于 05-22 08:56 ?833次閱讀
    <b class='flag-5'>linux</b>的<b class='flag-5'>進(jìn)程</b>怎么查看

    深度剖析Linux進(jìn)程控制(上)

    Linux中,fork函數(shù)是非常重要的函數(shù),它從已存在進(jìn)程中創(chuàng)建一個(gè)新進(jìn)程。新進(jìn)程為子進(jìn)程,而原進(jìn)程
    的頭像 發(fā)表于 05-12 10:49 ?489次閱讀
    深度剖析<b class='flag-5'>Linux</b>中<b class='flag-5'>進(jìn)程</b>控制(上)

    深度剖析Linux進(jìn)程控制(下)

    Linux中,fork函數(shù)是非常重要的函數(shù),它從已存在進(jìn)程中創(chuàng)建一個(gè)新進(jìn)程。新進(jìn)程為子進(jìn)程,而原進(jìn)程
    的頭像 發(fā)表于 05-12 10:49 ?446次閱讀
    深度剖析<b class='flag-5'>Linux</b>中<b class='flag-5'>進(jìn)程</b>控制(下)

    linux查看weblogic進(jìn)程

    Linux操作系統(tǒng)中,WebLogic是一種常用的Java應(yīng)用服務(wù)器,用于部署和管理企業(yè)級(jí)Java應(yīng)用程序。為了確保WebLogic服務(wù)器正常運(yùn)行,有時(shí)我們需要查看WebLogic進(jìn)程以了解其狀態(tài)
    的頭像 發(fā)表于 12-05 16:07 ?1643次閱讀