linux獲取進程id和進程名稱
作為一個共享庫,應該需要統計使用本庫的各種應用程序的使用頻率,
使用方法等信息。才能針對主要應用做出更好的改進。
www.2cto.com
那麼就需要記錄調用者的進程id或者進程名稱,並且保存下來。
保存的動作可以采用共享內存,也可以采用文件,這個在下篇博文描述,
本文描述如何獲取進程id和進程名稱。
范例:
#include <stdio.h>
#include <unistd.h>
#define CFGMNG_TASK_NAME_LEN 256
int main()
{
int ret;
char ac_tmp[CFGMNG_TASK_NAME_LEN];
ret = cfgmng_get_taskname(ac_tmp, CFGMNG_TASK_NAME_LEN);
if (0 != ret) {
printf("Call cfgmng_get_taskname fail.\n");
return -1;
}
printf("The running task name is %s.\n", ac_tmp);
return 0;
}
int cfgmng_get_taskname(char *ac, int len)
{
int count = 0;
int nIndex = 0;
char chPath[CFGMNG_TASK_NAME_LEN] = {0};
char cParam[100] = {0};
char *cTem = chPath;
int tmp_len;
pid_t pId = getpid();
sprintf(cParam,"/proc/%d/exe",pId);
/* printf("cParam = %s.\n", cParam);*/
count = readlink(cParam, chPath, CFGMNG_TASK_NAME_LEN);
/* printf("count = %d.\n", count);*/
if (count < 0 || count >= CFGMNG_TASK_NAME_LEN)
{
printf("Current System Not Surport Proc.\n");
return -1;
}
else
{
nIndex = count - 1;
for( ; nIndex >= 0; nIndex--)
{
if( chPath[nIndex] == '/' )//篩選出進程名
{
nIndex++;
cTem += nIndex;
break;
}
}
}
tmp_len = strlen(cTem);
if (0 == tmp_len) {
printf("Get task fail.\n");
return -1;
}
if (len <= tmp_len +1) {
printf("len(%d) is less than taskname(%s)'s len.\n", len, cTem);
return -1;
}
strcpy(ac, cTem);
return 0;
}
從上面的實驗范例可以看出,主要使用的函數是getpid獲取本進程的id,再到/proc/pid/exe
中去找到對應的進程名稱。在/proc目錄中有很多跟進程相關的東西,都可以用這種方法觸類旁通地實現。