linux c通过进程名获取进程id,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()的定义如下:

#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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值