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

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

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

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

xCb1_yikoulinux ? 來源:程序員寫個解 ? 作者:吳解君 ? 2022-04-15 12:25 ? 次閱讀

引言

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

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

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

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

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

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

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

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

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

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

怎么做

先貼代碼再解釋。

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

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

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

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

kill -19

kill -18

命令輸入 “kill -l” 可查閱到所有信號。

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

寫個測試程序

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

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

文稿貼的兩張圖是測試的方法,主進(jìn)程傳遞給子進(jìn)程3個參數(shù)“aa bb cc”,剛啟動后子進(jìn)程被信號暫停(T),左側(cè)輸入回車后子進(jì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,這個腳本將抓取1秒的數(shù)據(jù),再切換到左側(cè)窗口按Enter鍵。打開trace文件/tmp/a.txt,怎么樣了,echo命令的執(zhí)行信息被抓取下來了。

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

實驗里用到的ftrace-pid.sh腳本我把他的源碼貼在下面。

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

思考

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

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    87

    文章

    11314

    瀏覽量

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

    關(guān)注

    30

    文章

    4796

    瀏覽量

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

    關(guān)注

    37

    文章

    3279

    瀏覽量

    57741

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    一文搞懂Linux進(jìn)程的睡眠和喚醒

    ): 進(jìn)程在等待某個條件滿足(如I/O操作),可以被信號喚醒。 Linux通過內(nèi)核提供的系統(tǒng)調(diào)用來控制進(jìn)程的睡眠。常用的系統(tǒng)調(diào)用有: sleep(): 使進(jìn)程
    發(fā)表于 11-04 15:15

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

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

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

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

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

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

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

    PCB包含了一個進(jìn)程的重要運行信息,所以我們將圍繞在創(chuàng)建一個新進(jìn)程時,如何來建立一個新的PCB的這一個過程來進(jìn)行分析,在Linux系統(tǒng)中,PCB主要是存儲在一個叫做task_struct這一個結(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)知識。 掌握
    發(fā)表于 04-28 14:57 ?0次下載

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

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

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

    較長的進(jìn)程,通常獨立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程常常在系統(tǒng)引導(dǎo)載入時啟動,在系統(tǒng)關(guān)閉時終止。Linux有很多系統(tǒng)服務(wù),大多數(shù)服務(wù)都是通過守護(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的時候,將用戶進(jìn)程和部分內(nèi)核線程置于“可控”的暫停狀態(tài)。 2 為什么需要凍結(jié)技術(shù)
    發(fā)表于 05-06 16:00 ?780次閱讀

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

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

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

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

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

    Linux中,fork函數(shù)是非常重要的函數(shù),它從已存在進(jìn)程中創(chuàng)建一個新進(jìn)程。新進(jìn)程為子進(jìn)程,而原進(jìn)程
    的頭像 發(fā)表于 05-12 10:49 ?518次閱讀
    深度剖析<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è)級Java應(yīng)用程序。為了確保WebLogic服務(wù)器正常運行,有時我們需要查看WebLogic進(jìn)程以了解其狀態(tài)
    的頭像 發(fā)表于 12-05 16:07 ?1932次閱讀