免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 逆风而行
打印 上一主题 下一主题

高手帮忙啊 父进程fork出来的子进程名怎么改名 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-08-27 15:46 |只看该作者

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
12 [报告]
发表于 2010-08-27 15:48 |只看该作者
请问ls两位,
改argv[0]应该放在哪里改呢?

论坛徽章:
0
13 [报告]
发表于 2010-08-27 15:50 |只看该作者
回复 12# pandaiam
在子进程里


extern char *__progname;也比较方便.

论坛徽章:
0
14 [报告]
发表于 2010-08-27 18:09 |只看该作者
回复  pandaiam
在子进程里


extern char *__progname;也比较方便.
梅川内依酷 发表于 2010-08-27 15:50



  xuexile!!!!!

论坛徽章:
0
15 [报告]
发表于 2010-08-27 18:34 |只看该作者
LZ可以google一下setproctitle
nginx就里用到这个来修改监控进程和工作进程的名称
LZ可以下nginx的源码找下相关代码。
多看点代码总有好处 嘿嘿{:3_194:}

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
16 [报告]
发表于 2010-08-27 18:39 |只看该作者
其实一般是通过直接修改argv[0],但要注意argv[0]指向的这块内存也存放了环境变量,所以修改这个内容之前最好把这个内容备份一下。当然如果操作系统提供了setproctitle函数,则最好,如果没有,我是使用自己写的setproctitle函数:
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <string.h>
  4. #include <stdlib.h>

  5. # define MAXLINE 2048

  6. #ifdef Linux
  7.   #include <sys/prctl.h>
  8. #endif

  9. extern "C"
  10. {
  11.     extern char **environ;
  12. }

  13. static char                **g_main_Argv = NULL;                /* pointer to argument vector */
  14. static char                *g_main_LastArgv = NULL;        /* end of argv */

  15. void setproctitle_init(int argc, char **argv, char **envp)
  16. {
  17.     int i;

  18.     for (i = 0; envp[i] != NULL; i++)
  19.         continue;
  20.     environ = (char **) malloc(sizeof (char *) * (i + 1));
  21.     for (i = 0; envp[i] != NULL; i++)
  22.         environ[i] = strdup(envp[i]);//xstrdup(envp[i]);
  23.     environ[i] = NULL;

  24.     g_main_Argv = argv;
  25.     if (i > 0)
  26.       g_main_LastArgv = envp[i - 1] + strlen(envp[i - 1]);
  27.     else
  28.       g_main_LastArgv = argv[argc - 1] + strlen(argv[argc - 1]);
  29. }

  30. void setproctitle(const char *fmt, ...)
  31. {
  32.         char *p;
  33.         int i;
  34.         char buf[MAXLINE];

  35.         extern char **g_main_Argv;
  36.         extern char *g_main_LastArgv;
  37.     va_list ap;
  38.         p = buf;

  39.     va_start(ap, fmt);
  40.         vsprintf(p, fmt, ap);
  41.         va_end(ap);


  42.         i = strlen(buf);

  43.         if (i > g_main_LastArgv - g_main_Argv[0] - 2)
  44.         {
  45.                 i = g_main_LastArgv - g_main_Argv[0] - 2;
  46.                 buf[i] = '\0';
  47.         }
  48.         (void) strcpy(g_main_Argv[0], buf);
  49.         p = &g_main_Argv[0][i];
  50.         while (p < g_main_LastArgv)
  51.                 *p++ = '\0';//SPT_PADCHAR;
  52.         g_main_Argv[1] = NULL;

  53. #ifdef Linux
  54.      prctl(PR_SET_NAME,buf);
  55. #endif

  56. }

  57. /*
  58. #include <unistd.h>
  59. int main(int argc, char *argv[], char *envp[])
  60. {
  61.     setproctitle_init(argc, argv, envp);

  62.     setproctitle("%s@%s", "test_very_long_user_name_in_process_name", "192.168.123.145");

  63.     while(1)
  64.         sleep(10);

  65.     return 0;
  66. }
  67. */
复制代码

评分

参与人数 1可用积分 +1 收起 理由
shang2010 + 1

查看全部评分

论坛徽章:
0
17 [报告]
发表于 2010-08-28 11:21 |只看该作者
终于找到了一种各种平台的实现:大家可以参看PostgreSQL的实现:
http://doxygen.postgresql.org/ps__status_8c-source.html

论坛徽章:
0
18 [报告]
发表于 2010-08-28 15:50 |只看该作者
这个还不知道

论坛徽章:
0
19 [报告]
发表于 2010-08-28 16:04 |只看该作者
晕  咋会有这个想法啊!我还真的没有想到过
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP