linux获取进程id和进程名称
作为一个共享库,应该需要统计使用本库的各种应用程序的使用频率,
使用方法等信息。才能针对主要应用做出更好的改进。
www.zhishiwu.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目录中有很多跟进程相关的东西,都可以用这种方法触类旁通地实现。