在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    11322

    瀏覽量

    209857
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68749
  • 應用程序
    +關注

    關注

    37

    文章

    3283

    瀏覽量

    57755

原文標題:僅40行代碼,Linux如何以暫停狀態啟動新進程,當然是發送信號呀

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

收藏 人收藏

    評論

    相關推薦

    Linux系統下進程的幾種狀態介紹

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

    一文搞懂Linux進程的睡眠和喚醒

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

    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

    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進程凍結技術需要了解

    進程凍結技術(freezing of tasks)是指在系統hibernate或者suspend的時候,將用戶進程和部分內核線程置于“可控”的暫停狀態。 2 為什么需要凍結技術
    發表于 05-06 16:00 ?784次閱讀

    Linux 進程狀態淺析

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

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

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

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

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

    linux查看weblogic進程

    Linux操作系統中,WebLogic是一種常用的Java應用服務器,用于部署和管理企業級Java應用程序。為了確保WebLogic服務器正常運行,有時我們需要查看WebLogic進程以了解其狀態
    的頭像 發表于 12-05 16:07 ?1940次閱讀
    主站蜘蛛池模板: 亚洲综合啪啪| 日韩卡1卡2卡三卡四卡二卡免| free性乌克兰高清videos| 中文字幕一区二区三区在线不卡 | 国模谢心2013.05.06私拍| 国产成人影院| 爱操视频在线观看| 欧美系列在线观看| 日本一区视频在线观看| 在线播放你懂| 瑟瑟网站免费| 美女毛片免费| 成人永久免费视频| 精品视频卡1卡2卡3| 国产农村一一级特黄毛片| 永久在线免费| 久久午夜网| 22eee在线播放成人免费视频| 激情久久婷婷| 特级全毛片| 久久久成人影院| 一级特黄aaa大片在| 国产精品嫩草影院在线播放| 最新版天堂资源官网| 免费鲁丝片一级观看| 欧美大色网| 伊人成伊人成综合网2222| 日本番囗| 97成人免费视频| 精品久久天干天天天按摩| 4438全国最大成人免费高清| 一级特黄aa毛片免费观看| 日本v片免费一区二区三区| 大量喷潮free| 久久天天躁狠狠躁夜夜2020一 | 在线国产播放| а中文在线天堂| 中国黄色一级毛片| 男女网站在线观看| 婷婷久久五月天| 97爱sese|