近期开发的系统功能涉及到进程之间的查询、进程对进程的启停操作。
在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()的定义如下:
#inlcudeFILE *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!