Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12170
  • 博文数量: 3
  • 博客积分: 88
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-25 16:39
文章分类
文章存档

2012年(3)

我的朋友

分类: LINUX

2012-08-25 16:43:14

在开发实践中,有时候需要更改进程的名称(例如在fork出一堆子进程时,我们需要在top或者ps 的时候能区分父子进程,对其查看和管理)。很多人知道通过prctl系统调用可以修改进程名称,它的确能修改进程名称,但他有明确的长度限制,在我的linux环境下它最多支持15个字节的进程名,超长后就会被截断。

 

    我们知道进程名是存在argv[0]中的,能否直接在代码中直接修改argv[0]的值来修改进程名呢?答案是可以的,但需要注意的是如果给出新名称过长,可能会超过argv[0]的原有的空间大小,这样就会覆盖argv[1]的内容。幸运的是在阅读nginx源码的时候发现在linux环境下 argv 环境变量 environ 在内存空间上是相邻的,这样可以就可以搞些小动作,将environargv[1]以及其后的参数保存到别的地方去,腾出这一整块的内存空间给argv[0]使用,这样就可以随心所欲的修改进程名称了,长度不再是问题。

    参照nginx的源码,给出的demo如下:


点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<unistd.h>
  4. #include<sys/prctl.h>
  5. #include<stdint.h>

  6. extern char **environ;
  7. char** pp_argv;
  8. char* pEnvLast = NULL;

  9. void backupEnv()
  10. {
  11.     uint32_t i = 0;
  12.     uint32_t envSize = 0;
  13.     for (i = 0 ; environ[i] ; ++i)
  14.     {
  15.         envSize = envSize + strlen(environ[i]) + 1;
  16.     }
  17.     pEnvLast = environ[i-1] + strlen(environ[i-1]) + 1;
  18.     char* pEnv = new char[envSize];
  19.     //备份环境变量
  20.     for (i = 0 ; environ[i] ; ++i)
  21.     {
  22.         strcpy(pEnv,environ[i]);
  23.         pEnv = pEnv + strlen(environ[i]) + 1;
  24.         environ[i] = pEnv;
  25.     }
  26. }

  27. void setProcTitle(const char* title)
  28. {
  29.     pp_argv[1] = NULL;
  30.     strncpy(pp_argv[0],title,pEnvLast-pp_argv[0]);
  31.     //如果进程名称比较短,可以直接使用prctl来修改
  32.     //prctl(PR_SET_NAME,title);
  33. }

  34. int main(int argc, char* argv[])
  35. {
  36.     if (2 != argc)
  37.     {
  38.         printf("usuage:%s newTitle\n",argv[0]);
  39.         return 0;
  40.     }

  41.     pp_argv = (char**) argv;
  42.     char procName[100];
  43.     strcpy(procName,argv[1]);
  44.     backupEnv();
  45.     setProcTitle(procName);
  46.    
  47.     //休眠,便于通过top或者ps 观察进程名称
  48.     sleep(20);
  49.     return 0;
  50. }

阅读(3255) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:ostringstream的性能问题

给主人留下些什么吧!~~