Linux下C語言開發(已知進程名得到其PID號)

在我的另外一個篇博客【LinuxC語言開發(信號signal處理機制)】中需要測試系統調用kill來向指定進行號發送指定的信號,在同一個測試文件很容易獲取當前進程的pid,只需調用getpid()函數就可獲取當前進程的pid。但是,如果要獲取非當前進程的pid,那應該如何獲取呢?即我們需要在Linux C 程序中,已知其他進程的名字,來獲取其進程的pid。此時此刻我只能百度了,上網百度,找到兩種可行的方法:

1、通過popen創建一個管道,執行shell命令並得到返回結果

2、通過搜素/proc文件夾下的文件內容,得到進程PID(這裏也可以學習下Linux C中如何讀取一個文件夾中的內容)

爲了方便測試,隨便創建l一個progress.c文件,文件內容如下:

保存後,輸入gcc progress.c -o progress將代碼編譯爲二進制文件progress,並使用./progress運行。當我們運行progress,由於程序中加了for(;;);死循環,這樣此進行就一直在運行着,方便我們來獲取progress進程的pid。

一、通過popen的方法

我們知道,在shell下可以通過下述命令來得到進程progress的pid:

ps -e | grep 'test' | awk 'print $1'

(注意:這個命令中,名字中含有progress字樣的進程都會被掃描到,如果只針對名字恰好爲progress的進程,則需要修改這個命令)

那麼在Linux C 程序中,只要將這個命令移到shell環境中執行一下,並讀取其執行結果即可。在Linux C 程序中執行shell命令可以通過popen函數,該函數會返回一個文件指針,可以向操作文件一樣對這個返回的指針進行操作。

創建一個getOtherProgreessPid.c文件,文件內容如下:

保存後,輸入gcc getOtherProgreessPid.c -ogetOtherProgreessPid將代碼編譯爲二進制文件getOtherProgreessPid,並使用./getOtherProgreessPid運行

二、通過搜素/proc文件夾下的內容獲取進程pid

在系統的/proc文件夾下,保存有系統當前所有進程的信息,比如一個進程的pid爲10000,那麼/proc下會有一個名字爲10000的文件夾,其中包含該進程的幾乎所有信息:其中/proc/10000/cmdline文件中保存了啓動該進程時使用的命令行。

由於剛纔的進程是通過./progress運行的,因此只要遍歷/proc下的文件夾,如果發現某個文件夾中的cmdline文件內容爲./progress,則該文件夾的名字即爲該進程的pid。

重新新建了一個getOtherProgreessPid2.c,其getOtherProgreessPid2.c文件內容如下:

保存後,輸入gcc getOtherProgreessPid2.c -o getOtherProgreessPid2將代碼編譯爲二進制文件getOtherProgreessPid2,並使用./progress先運行progress進程,後在另外一個終端中使用./getOtherProgreessPid2運行getOtherProgreessPid2進程

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章