作为一个共享库,应该需要统计使用本库的各种应用程序的使用频率,使用方法等信息。才能针对主要应用做出更好的改进。
那么就需要记录调用者的进程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目录中有很多跟进程相关的东西,都可以用这种方法触类旁通地实现。
阅读(17559) | 评论(0) | 转发(0) |