- 论坛徽章:
- 3
|
其实一般是通过直接修改argv[0],但要注意argv[0]指向的这块内存也存放了环境变量,所以修改这个内容之前最好把这个内容备份一下。当然如果操作系统提供了setproctitle函数,则最好,如果没有,我是使用自己写的setproctitle函数:- #include <stdio.h>
- #include <stdarg.h>
- #include <string.h>
- #include <stdlib.h>
- # define MAXLINE 2048
- #ifdef Linux
- #include <sys/prctl.h>
- #endif
- extern "C"
- {
- extern char **environ;
- }
- static char **g_main_Argv = NULL; /* pointer to argument vector */
- static char *g_main_LastArgv = NULL; /* end of argv */
- void setproctitle_init(int argc, char **argv, char **envp)
- {
- int i;
- for (i = 0; envp[i] != NULL; i++)
- continue;
- environ = (char **) malloc(sizeof (char *) * (i + 1));
- for (i = 0; envp[i] != NULL; i++)
- environ[i] = strdup(envp[i]);//xstrdup(envp[i]);
- environ[i] = NULL;
- g_main_Argv = argv;
- if (i > 0)
- g_main_LastArgv = envp[i - 1] + strlen(envp[i - 1]);
- else
- g_main_LastArgv = argv[argc - 1] + strlen(argv[argc - 1]);
- }
- void setproctitle(const char *fmt, ...)
- {
- char *p;
- int i;
- char buf[MAXLINE];
- extern char **g_main_Argv;
- extern char *g_main_LastArgv;
- va_list ap;
- p = buf;
- va_start(ap, fmt);
- vsprintf(p, fmt, ap);
- va_end(ap);
- i = strlen(buf);
- if (i > g_main_LastArgv - g_main_Argv[0] - 2)
- {
- i = g_main_LastArgv - g_main_Argv[0] - 2;
- buf[i] = '\0';
- }
- (void) strcpy(g_main_Argv[0], buf);
- p = &g_main_Argv[0][i];
- while (p < g_main_LastArgv)
- *p++ = '\0';//SPT_PADCHAR;
- g_main_Argv[1] = NULL;
- #ifdef Linux
- prctl(PR_SET_NAME,buf);
- #endif
- }
- /*
- #include <unistd.h>
- int main(int argc, char *argv[], char *envp[])
- {
- setproctitle_init(argc, argv, envp);
- setproctitle("%s@%s", "test_very_long_user_name_in_process_name", "192.168.123.145");
- while(1)
- sleep(10);
- return 0;
- }
- */
复制代码 |
评分
-
查看全部评分
|