在我的另外一個篇博客【Linux下C語言開發(信號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進程