【tag | 您所在的位置:网站首页 › linux修改进程名字 › 【tag |
本节开始进入到进程的话题 在正式进行多进程代码编写前,还需要修改一下本工程运行之后在终端显示的进程名称,根据之前几节的内容,在main函数中添加一个死循环,保证程序运行后不退出,以便观察进程名称。 for(;;) { sleep(1); }重新编译运行后,在终端查看进程名称 ps aux | grep -E 'bash|PID|nginx'
接下来,根据nginx官方源码,我们给自己的程序修改显示的进程名 在 ngx_global.h 文件中新增几个全局变量保存参数和环境变量用以备份 //用于修改进程名称 extern char **g_os_argv; extern char *gp_envmem; extern int g_environlen; extern int g_argvlen; extern int g_os_argc; //参数个数在 main.cxx 中定义这几个变量 char **g_os_argv; char *gp_envmem = nullptr; int g_environlen = 0; int g_argvlen = 0; int g_os_argc; //参数个数然后再main 函数中用这几个全局变量保存环境变量和main函数的输入参数 for(int i = 0; i g_environlen += strlen(environ[i]) + 1; } g_os_argc = argc; g_os_argv = (char **) argv;到这里就可以开始动手了 Note: 本工程我们不会用到命令行输入的参数,所以直接在内存中将其覆盖掉了。 在 ngx_func.h 文件声明修改进程名相关的函数 //设置可执行程序标题相关函数 void ngx_init_setproctitle(); void ngx_setproctitle(const char *title);在 src 目录新建 ngx_setproctitle.cxx 文件用于对这两个函数的实现 初始化函数用于参数和环境变量的备份 //设置可执行程序标题相关函数:分配内存,并且把环境变量拷贝到新内存中来 void ngx_init_setproctitle() { //new 失败时就让程序崩溃吧【这里分配了内存,一定要记得释放,本程序放在了 main.cxx 中的 freereSource() 函数中】 gp_envmem = new char[g_environlen]; memset(gp_envmem,0,g_environlen); //内存要清空防止出现问题 char *ptmp = gp_envmem; //把原来的内存内容搬到新地方来 for (int i = 0; environ[i]; i++) { //这个加1还是很重要的,这个位置存放 '\0' size_t size = strlen(environ[i])+1 ; strcpy(ptmp,environ[i]); //把原环境变量内容拷贝到新地方【新内存】 environ[i] = ptmp; //然后还要让新环境变量指向这段新内存 ptmp += size; } return; } 修改进程名字 //设置可执行程序标题 void ngx_setproctitle(const char *title) { //我们假设,所有的命令 行参数我们都不需要用到了,可以被随意覆盖了; //注意:我们的标题长度,绝对不能长到原始标题和原始环境变量都装不下 //计算新标题长度 size_t ititlelen = strlen(title); size_t esy = g_argvlen + g_environlen; //argv和environ内存总和 if( esy ngx_pid = getpid(); for(int i = 0; i g_environlen += strlen(environ[i]) + 1; } g_os_argc = argc; g_os_argv = (char **) argv; //加载配置文件内容 if(false == CConfig::GetInstance()->LoadConfig("nginx_sim.conf")) { //日志初始化(创建/打开日志文件) ngx_log_init(); ngx_log_stderr(0,"配置文件[%s]载入失败,退出!","nginx_sim.conf"); //找不到文件 goto lblexit; } //日志初始化(创建/打开日志文件) ngx_log_init(); //把环境变量搬家 ngx_init_setproctitle(); //这里设置进程名测试 ngx_setproctitle("nginx-sim: master process"); //这个死循环主要方便观察进程名称 for(;;) { sleep(1); } ngx_log_stderr(0, "从配置文件中读到的 log 目录:%s",(CConfig::GetInstance()->GetString("Log")).c_str()); ngx_log_stderr(0, "从配置文件中读到的 log 等级:%d",CConfig::GetInstance()->GetIntDefault("LogLevel",NGX_LOG_NOTICE)); lblexit: ngx_log_stderr(0,"程序退出!"); //该释放的资源要释放掉 freereSource(); //一系列的main返回前的释放动作函数 return 0; }
接下来将我们的程序做成一个守护进程。 |
CopyRight 2018-2019 实验室设备网 版权所有 |