引言
上星期新加一好友,在好友的朋友圈動態(tài)里看到一張聊天截圖,是署名為“閱碼場”的Linux內(nèi)核技術(shù)交流群, 群友提問:
“請教一個Bash的問題:有沒有什么辦法讓一個新開的進程,一開始就處于暫停狀態(tài),直到我輸入fg?”
巧了,上星期我在嘗試使用ftrace根據(jù)進程號(PID)過濾、跟蹤內(nèi)核執(zhí)行過程時,迫切需要一個 進程啟動后處于暫停狀態(tài) ,與這位群友一樣,也是滿世界尋找Bash是否有內(nèi)置類似該功能,為什么我需要它呢?
倘若一個應(yīng)用程序是死循環(huán),或者執(zhí)行時間相對較舊,哪怕只執(zhí)行1秒,我Left Golden Finger完全可以輸入 “Ctrl+Z” 暫停它,借助pidof獲取進程的PID號,將其填入set_ftrace_pid僅過濾該進程信息,輸入 “fg” 恢復(fù)進程執(zhí)行。
再看另一個應(yīng)用場景,若某個進程執(zhí)行耗時很短呢?例如“echo”命令轉(zhuǎn)瞬即逝,完全沒有反應(yīng)的機會。
再舉例,倘若我就想抓取從應(yīng)用程序開始執(zhí)行到“Ctrl+Z”之間幾百毫秒的內(nèi)核執(zhí)行過程,我又該怎么?
“拿到源碼重新編譯,在main函數(shù)開始時添加足夠的延時。”頭上長尖角的小人說。
“耍流氓!無恥!偷換概念!”頭上另一個長翅膀小人指責。
好吧,別辯論了,回歸正題。
既然群友都和我一樣沒能找到Bash內(nèi)置實現(xiàn),再怎么說“閱碼場”聊天群也是人類高質(zhì)量碼農(nóng)的聚集地,我相信他也不是伸手黨。那么是時候造車子了,寫幾行代碼實現(xiàn)這個功能,沒騙你,真幾行,發(fā)個信號而已。
怎么做
先貼代碼再解釋。
首先要了解系統(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” 可查閱到所有信號。
寫個測試程序
寫另外一個測試程序child.c,僅打印進程的PID號,以及調(diào)試主進程是否能成功傳遞參數(shù)給子進程。
文稿貼的兩張圖是測試的方法,主進程傳遞給子進程3個參數(shù)“aa bb cc”,剛啟動后子進程被信號暫停(T),左側(cè)輸入回車后子進程得以運行(S)。
使用新輪子
恩,輪子造好了,看看它的效果怎么樣,用它協(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í)行信息被抓取下來了。
實驗里用到的ftrace-pid.sh腳本我把他的源碼貼在下面。
思考
我在使用kill發(fā)送信號時有個疑問,既然應(yīng)用程序收到SIGSTOP信號后就處于停止狀態(tài),既然停止了,為什么還能處理之后的SIGCONT信號呢?之前是進程可運行,才能被調(diào)度、能處理信號,很好理解。之后進程都停止了,又怎么能處理SIGCONT信號恢復(fù)執(zhí)行呢?你能夠用鼠標點擊左下角“開始”菜單關(guān)閉計算機,卻無法繼續(xù)用鼠標使其開機。所以我猜測信號處理首先是由于調(diào)度器處理的。
第二個擴展問題,gdb調(diào)試應(yīng)用程序是可以暫停應(yīng)用程序執(zhí)行的,它使用的是ptrace。你能否寫一個應(yīng)用程序,它利用ptrace原理去暫停子進程執(zhí)行。我說的暫停位置可不是main,甚至在main之前。應(yīng)用程序啟動時 “第一個系統(tǒng)調(diào)用是什么?” 嘗試找到它,并截獲。
原文標題:僅40行代碼,Linux如何以暫停狀態(tài)啟動新進程,當然是發(fā)送信號呀
文章出處:【微信公眾號:一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11294瀏覽量
209343 -
代碼
+關(guān)注
關(guān)注
30文章
4780瀏覽量
68527 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3266瀏覽量
57679
原文標題:僅40行代碼,Linux如何以暫停狀態(tài)啟動新進程,當然是發(fā)送信號呀
文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論