1. 程式人生 > >如何通過程序pid獲取程序名、可執行檔案的名稱

如何通過程序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啦。