如何通过进程pid获取进程名、可执行文件的名称

一、过进程pid获取到进程名。

如下:

void getNameByPid(pid_t pid, char *task_name) {
    char proc_pid_path[BUF_SIZE];
    char buf[BUF_SIZE];

    sprintf(proc_pid_path, "/proc/%d/status", pid);
    FILE* fp = fopen(proc_pid_path, "r");
    if(NULL != fp){
        if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
            fclose(fp);
        }
        fclose(fp);
        sscanf(buf, "%*s %s", task_name);
    }
}
注:

ssanf()小知识点:

给定一个字符串“hello, world”,仅保留world。
(注意:“,”之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串)

sscanf(“hello,world”,"%*s%s",buf);
printf("%s\n",buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即“hello,”被过滤了

原文链接如下:http://www.jb51.net/article/45012.htm

实际测试结果如下:

执行命令./response_sync_serv realtime public test_zhj 50000
ps -elf | grep response_sync_serv
290:0 S d5000 13587 4171 99  78   0 - 24387 run_in 14:41 pts/2    00:02:05 

查看 /proc/13587/status

cat /proc/13587/status 
Name:	response_sync_s
State:	S (sleeping)
SleepAVG:	78%
Tgid:	13587
Pid:	13587
PPid:	4171
TracerPid:	0
Uid:	101	101	101	101
Gid:	100	100	100	100
FDSize:	64
Groups:	100 
VmPeak:	   97736 kB
VmSize:	   97548 kB
VmLck:	       0 kB
VmHWM:	    3964 kB
VmRSS:	    3796 kB
VmData:	   50320 kB
VmStk:	      84 kB
VmExe:	       4 kB
VmLib:	    4916 kB
VmPTE:	     144 kB
Threads:	7
SigQ:	2/122880
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000001000
SigCgt:	0000000180000000
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
发现进程名和可执行程序的名称并非完全相同。
那么如果我想获取可执行文件的名称呢?

二、通过进程pid获取可执行文件的名称(大牛同事支招,O(∩_∩)O哈哈~)

#include <stdio.h> 
#include <unistd.h>
#include <string.h>
#define PROC_NAME_LEN 256


int get_proc_name(char *proc_name)
{
	char *p = NULL;
	int count = 0;
	char chPath[PROC_NAME_LEN] = {0};
	char cParam[PROC_NAME_LEN] = {0};

	pid_t pId = getpid();
	sprintf(cParam,"/proc/%d/exe",pId);
	count = readlink(cParam, chPath, PROC_NAME_LEN);
	if (count < 0 || count >= PROC_NAME_LEN)
	{
		printf("Current System not Surport Proc\n");
		return -1;
	}
	else
	{
		p = basename(chPath);
		if(p == NULL)
		{
			return -1;
		}
	}

	strcpy(proc_name, basename(chPath));
	return 0;
}


int main() 
{
	int ret;
	char proc_name[PROC_NAME_LEN] = {0};

	ret = get_proc_name(proc_name);   
	if (0 != ret)
	{
		printf("Get proc name fail\n");
		return -1;
	}

	printf("The running proc name is [%s]\n", proc_name);
	return 0;
}
ok啦。


猜你喜欢

转载自blog.csdn.net/tustzhoujian/article/details/51373086