Linux下用C++实现通过进程名称获取进程ID

近期开发的系统功能涉及到进程之间的查询、进程对进程的启停操作。

在shell环境下,使用进程名称查询进程ID非常简单,例如通过 ps -ef | grep "proc_name"来查看名为“proc_name”进程,

也可以通过pidof "proc_name"来获取进程ID。

例如:

mvg@ubuntu-MS-7A54:~/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
mvg@ubuntu-MS-7A54:~/test$ pidof chip_det_main
27290

那么在C/C++中,该如何实现呢?

方法不止一种,我采用了一种看起来最简单的方法,通过C语言创建并执行shell命令,具体实现函数如下:

  1 #include 
  2 #include 
  3 #include 
  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
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;
}

编译执行,结果如下:

mvg@ubuntu-MS-7A54:~/test$ ./test_getPIDbyName chip_det_main
pid = 28258

对比一下命令行直接执行的结果:

mvg@ubuntu-MS-7A54:~/test$ ./test_getPIDbyName chip_det_main
pid = 28258
mvg@ubuntu-MS-7A54:~/test$ pidof chip_det_main
28258
mvg@ubuntu-MS-7A54:~/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
mvg@ubuntu-MS-7A54:~/test$

功能OK!

你可能感兴趣的:(Linux,编程开发)