Linux下 prctl 进程控制

Linux 下 prctl 进程控制

Linux下可通过 prctl进行进程各种控制

       #include 
       int prctl(int option, unsigned long arg2, unsigned long arg3,
                 unsigned long arg4, unsigned long arg5);
  • option :第一个参数是 int ,描述函数操作类型。比如:PR_SET_NAME 这个操作在(linux 2.6.9 中引入),设置线程的名
  • arg2 参是指向 char* 的 指针,这里用一个 16 字节长度的无符号长整型来表示 char arg2[16] ,名字最长为16个字节
    ,包括结束符(超过16个字节,名称自动被截断) 。

设置线程名字 PR_SET_NAME

主要实现其实就是2行代码:

int main(int argc, char *argv[])
{
   char *thread_name = "Park";
   strcpy(argv[0], thread_name);
   prctl(PR_SET_NAME, thread_name,16);
}

获取线程名 PR_GET_NAME (since Linux 2.6.11)

第二个参数此时用来返回调用线程的名称。缓冲区应允许最多16个字节的空间;返回的字符串将以空结尾。

用于进程重命名,主进程、子进程使用不同的命令,便于命令ps -ef查看。

#include 
#include 
#include 
#include 
#include 

# define MAXLINE 2048

#define Linux

#ifdef Linux
  #include 
#endif

extern char **environ;

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

void prename_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 prename_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);          //该句是核心,把新的名字copy到 argv[0]
        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

}
int main(int argc, char *argv[], char *envp[])
{
   pr_setproctitle_init(argc, argv, envp);
   pr_setproctitle("%s:%s", "test_very_long_user_name_in_process_name", "192.168.123.145");
   while(1)
   sleep(10);
   return 0;
}

你可能感兴趣的:(linux,&,Unix)