如何通過程序pid獲取程序名、可執行檔案的名稱
阿新 • • 發佈:2019-02-20
一、過程序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啦。