1. 程式人生 > >Linux下用C++實現通過程序名稱獲取程序ID

Linux下用C++實現通過程序名稱獲取程序ID

近期開發的系統功能涉及到程序之間的查詢、程序對程序的啟停操作。

在shell環境下,使用程序名稱查詢程序ID非常簡單,例如通過 ps -ef | grep "proc_name"來檢視名為“proc_name”程序,

也可以通過pidof "proc_name"來獲取程序ID。

例如:

[email protected]:~/test$ ps -ef | grep chip_det_main
mvg      27290 23866 99 17:32 pts/16   00:05:28 ./chip_det_main
mvg      27511 26672  0 17:33 pts/27   00:00:00 grep --color=auto chip_det_main
[email protected]:~/test$ pidof chip_det_main
27290

那麼在C/C++中,該如何實現呢?

方法不止一種,我採用了一種看起來最簡單的方法,通過C語言建立並執行shell命令,具體實現函式如下:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 
  5
  6 using namespace std;
  7
  8 pid_t getProcessPidByName(const char *proc_name)
  9 {
 10     FILE *fp;
 11     char buf[100];
 12     char cmd[200] = {'\0'};
 13     pid_t pid = -1;
 14     sprintf(cmd, "pidof %s", proc_name);
 15
 16     if((fp = popen(cmd, "r")) != NULL)
 17     {
 18         if(fgets(buf, 255, fp) != NULL)
 19         {
 20             pid = atoi(buf);
 21         }
 22     }
 23
 24     printf("pid = %d \n", pid);
 25
 26     pclose(fp);
 27     return pid;
 28 }

上述程式碼中,cmd陣列中存放的是shell命令列字串:pidof "proc_name",本例中,具體就是pidof chip_det_main。

簡單介紹一下pidof,該命令用於查詢指定名稱的程序的ID號,用法為:

pidof (選項) (引數)

選項為可選,有如下幾種:

-s:僅返回一個程序號 
-c: 僅顯示具有相同root目錄的程序
-x:顯示由指令碼開啟的程序
-o:指定不顯示的程序ID

引數即為要查詢的名稱的名稱。

此外,以上程式碼中還用到了popen()和pclose(),也順便簡單介紹一下。

popen()和pclose()的定義如下:

#inlcude<stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

其中,command引數就是一個shell命令字串指標,該命令被傳到bin/sh並被shell執行。

popen建立一個管道,通過fork或invoke一個子程序,用以執行command命令。command的返回值在標準IO流中,由於管道資料流是單向的,command只能產生stdout或stdin,因此type引數只能取"w"或"r"其中之一。popen的返回值即為執行該command命令返回資料流的指標。

popen一定要和pclose一起使用。

寫一個小小的測試程式,用來測試以上函式的功能:

int main(int argc, char** argv)
{
	if(argc != 2)
	{
        printf("Invalid input! \n");
        return -1;
	}
	char* process_name = argv[1];

	pid_t process_pid = getProcessIDByName((const char*)process_name);
	
    return 0;
}

編譯執行,結果如下:

[email protected]:~/test$ ./test_getPIDbyName chip_det_main
pid = 28258

對比一下命令列直接執行的結果:

[email protected]:~/test$ ./test_getPIDbyName chip_det_main
pid = 28258
[email protected]:~/test$ pidof chip_det_main
28258
[email protected]:~/test$ ps -ef | grep chip_det_main
mvg      28258 10332 99 17:51 pts/18   00:15:54 ./chip_det_main
mvg      29071 26672  0 17:54 pts/27   00:00:00 grep --color=auto chip_det_main
[email protected]:~/test$

功能OK!

相關推薦

LinuxC++實現通過程序名稱獲取程序ID

近期開發的系統功能涉及到程序之間的查詢、程序對程序的啟停操作。 在shell環境下,使用程序名稱查詢程序ID非常簡單,例如通過 ps -ef | grep "proc_name"來檢視名為“proc_name”程序, 也可以通過pidof "proc_name"來獲取程序

LinuxC實現域名到IP的轉換(域名解析)

只需呼叫一個函式即可gethostbyname(),gethostbyname()返回對應於給定主機名的包含主機名字和地址資訊的hostent結構指標。結構的宣告與gethostaddr()中一致。下面是函式原型: Windows平臺下 #include <winsock2.h>

LinuxC實現串列埠讀寫

 http://hi.baidu.com/weiweisuo1986/item/b33200134ceaac6871d5e81d         之前要做一個和串列埠相關的專案,才認真研究了下串列埠,首先就是要實現串列埠和PC機的通訊。          串列埠的驅動一般不需要我們寫,都是很成熟的驅動

Linuxc語言實現發送http請求 方式可以Get或者Post例程參考

sockaddr select sleep online 創建 線程終止 index -s lse [1].[代碼] Linux下用c語言實現發送http請求 方式可以Get或者Post 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 1

Linuxc語言實現傳送http請求 方式可以Get或者Post例程參考

[1].[程式碼] Linux下用c語言實現傳送http請求 方式可以Get或者Post 跳至 [1] ? 1 2

Linuxc語言實現傳送http請求

前言 在linux下,使用socket進行程式設計,需要到伺服器上進行獲取資料,伺服器使用的php程式設計,需要使用http的方式進行獲取資料。 程式碼 #include <stdio.h> #include <string.h&

LinuxC獲取當前時間

time() 使用 ble timespec -1 ber 區間 本地 指向 Linux下用C獲取當前時間,具體如下: 代碼(可以把clock_gettime換成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getN

linuxgdb實現程式宕機時自動列印呼叫堆疊

linux下程式執行幾天莫名其妙宕機了,不能還原現場,找到宕機原因就很無語了。 一個解決辦法是使用core檔案,但是對於大型伺服器檔案,動輒幾百M的core檔案是在有點傷不起,於是想到程式宕機時自動列印呼叫堆疊。簡單實用。

LinuxUDP實現檔案傳輸

UDP程式設計框圖                                           UDP協議中伺服器和客戶端的互動存在於資料的收發過程中。         進行網路資料收發的時候,伺服器和客戶端的資料是對應的:客戶端傳送資料的動作,對伺服器來說是接

linuxC編寫ftp客戶端

這是一個大作業,要求能夠模擬ftp協議,實現一個ftp客戶端,然後要求能夠實現相應的功能,主要是能夠實現ls,pwd,cwd(cd),put和get功能。然後是在被動模式下來實現這些功能。那麼首先我們需要對ftp協議有一個具體的瞭解,然後才能夠自己實現這個功能。 FTP

LinuxC獲取當前系統時間

#include   <time.h> time_t   time(time_t   calptr); 返回的是日曆時間,即國際標準時間公元1970年1月1日00   :   00   :   00以來經過的秒數。然後再呼叫 char   *ctime(const

Linux平臺C++實現訊號量,同步執行緒

    使用Linux平臺上現有的訊號量sem_t相關的一組API,可以方便地進行執行緒同步。現在用pthread_mutex_t和pthread_cond_t相關的一組API實現訊號量機制。這組API包括:pthread_mutex_init,pthread_cond_init,pthread_mu

linuxC編寫的基於smtp的帶附件郵件傳送程式

         今天做了一個簡單的stmp郵件傳送的客戶端demo,可以支援帶附件傳送,希望將實現分享一下, 目前測試環境是公司的內部郵箱,  有gmail郵箱測試沒有成功, 可能gmail郵箱需要ssl加密,後續再進行完善吧, 這個demo實現的非常簡單的阻塞的傳送傳送

linuxC語言獲取本地時間

一個小專案需要以系統時間(精確到微秒)為變數建立檔名,在網上搜索資料,在stackoverflow上找到了需要的東西,記下來備用 #include <sys/time.h> #include <time.h> #include <stdio

VSC++實現的簡單3D射擊遊戲(附遊戲檔案與源工程程式碼)

記不得什麼時候開始感興趣寫遊戲程式碼了。開始的時候就只是寫一些簡單的小遊戲,打檯球,開小車,走迷宮,用一些2Dgraphics庫,完成每個小作品後都很開心。後來一想,在現在的計算機裝置條件下,2D太簡陋了,於是開始著手做一個3D賽車遊戲。說是賽車,實際上也就只有一輛小車。模

linuxcjson實現對資料鍵值對的封裝儲存

首先需要下載封裝好的cjson包包括 cjson.h cjson.c 為方便大家我已上傳 下載地址如下 http://download.csdn.net/detail/wuheshi/8353075 程式設計時加入標頭檔案cjson.h 就可以呼叫cjson.c裡面的函

linuxwvdial實現gprs撥號上網

1. 安裝wvdial   sudo apt-get install wvdial   2. 在/etc/wvdial.conf中寫入wvdial的配置資訊: femacs /etc/wvdial.conf   Init1 = ATZ   Init2 = ATQ0 V1 E

編寫LinuxC語言訪問MySQL資料庫的程式

  在編寫這個程式的時候我和同學費了很大的力氣特別是在編譯的時候,下面我就把自己編譯的經驗給大家分享一下,希望大家能少走一些彎路。     我自己裝了mysql-5.0.41-linux-i686-glibc23.tar.gz 安裝部分就不說了!

Linuxrsync實現檔案同步

rsync是linux下的一款快速增量備份工具Remote Sync,是一款實現遠端同步功能的軟體(資料映象備份軟體),它在同步檔案的同時,可以保持原來檔案的許可權、時間、軟硬連結等附加資訊。它不像FTP那樣需要全備份,rsync可以根據資料的變化進行差異備份,從而減少資

LinuxC語言判斷程式是否已執行

通過程式名獲得程序號,然後和當前程式程序號做對比。 int isRunning() { int ret = 0; char sCurrPid[16] = {0}; spri