欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

获得线程名称:自定义prctl函数或者使用pthread_getname_np函数

最编程 2024-01-04 21:14:15
...

prctl(PR_GET_NAME, tname);

简单的封装:

#include <sys/prctl.h>
static char tname[16];
static char* get_current_threadname(){
    prctl(PR_GET_NAME, tname);
    return tname;
}

//#define P_LOGI(fmt, ...) ALOGI("[%s ],tid:%u,%s,F:%s:%d,Fun:%s " fmt,(char*)get_current_threadname(), (unsigned int)gettid(),mark_label,(char*)__FILE__,__LINE__,(char*)__FUNCTION__,##__VA_ARGS__)

使用方法:直接调用,get_current_threadname()其返回值就是了。

 

https://www.mkssoftware.com/docs/man3/pthread_getname_np.3.asp

https://blog.****.net/jasonchen_gbd/article/details/51308638

https://linux.die.net/man/3/pthread_getname_np

pthread_getname_np()没研究怎么用,看了参数,不知传什么进去。

 

 

Program source

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

#define NAMELEN 16

#define errExitEN(en, msg) \
            do { errno = en; perror(msg); exit(EXIT_FAILURE); \
        } while (0)

static void *
threadfunc(void *parm)
{
    sleep(5);          // allow main program to set the thread name
    return NULL;
}

int
main(int argc, char **argv)
{
    pthread_t thread;
    int rc;
    char thread_name[NAMELEN];

   rc = pthread_create(&thread, NULL, threadfunc, NULL);
    if (rc != 0)
        errExitEN(rc, "pthread_create");

   rc = pthread_getname_np(thread, thread_name, NAMELEN);
    if (rc != 0)
        errExitEN(rc, "pthread_getname_np");

   printf("Created a thread. Default name is: %s\n", thread_name);
    rc = pthread_setname_np(thread, (argc > 1) ? argv[1] : "THREADFOO");
    if (rc != 0)
        errExitEN(rc, "pthread_setname_np");

   sleep(2);

   rc = pthread_getname_np(thread, thread_name,
                            (argc > 2) ? atoi(argv[1]) : NAMELEN);
    if (rc != 0)
        errExitEN(rc, "pthread_getname_np");
    printf("The thread name after setting it is %s.\n", thread_name);

   rc = pthread_join(thread, NULL);
    if (rc != 0)
        errExitEN(rc, "pthread_join");

   printf("Done\n");
    exit(EXIT_SUCCESS);
}

See Also

prctl(2), pthread_create(3), pthreads(7) 

 

 

之前自己写的bug无数的接口:一直不明白为什么我自己写的就会导致线程错乱!!!

 


//------------------------------------------------------------------------------
//personal debug switch// 
//------------------------------------------------------------------------------
#ifndef P_LOGI 
#define P_DEBUG	1  //0 turn off debug ,1 turn on debug 
#if P_DEBUG 
#include "utils/Log.h"
//#ifndef _PTHREAD_H_
#include <pthread.h>
//#define _PTHREAD_H_
//#endif

/*
 *#ifndef _LOGHEADER_H_
 *#include "../../../gecko/ipc/contentproc/logheader.h"
 *#define ENABLE_THREAD_NAME 1 // 0 disable thread name, 1 enable thread name 
 *#endif
 */


#ifndef ENABLE_THREAD_NAME
#define ENABLE_THREAD_NAME 1 // 0 disable thread name, 1 enable thread name 
#if ENABLE_THREAD_NAME //begin of ENABLE_THREAD_NAME
//#define BUF_SIZE 1024


/*
 *static char* getNameByPid(pid_t pid,pid_t tid) {
 *    char proc_pid_path[BUF_SIZE];
 *    char buf[BUF_SIZE];
 *    char *task_name = new char ;
 *    sprintf(proc_pid_path, "/proc/%d/task/%d/stat", pid,tid);
 *    FILE* fp = fopen(proc_pid_path, "r");
 *    if(NULL != fp){
 *        if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
 *            fclose(fp);
 *        }
 *        fclose(fp);
 *        //sscanf(buf, "%*s%[^\n]%*s", task_name);
 *        sscanf(buf, "%*s%*[^(](%[^)]s", task_name);
 *        return task_name;
 *    }
 *    else{
 *        delete task_name;
 *        return (char*)"name-unknown";
 *    }
 *}
 */
#endif //end of ENABLE_THREAD_NAME 1 
#endif //end of ifndef ENABLE_THREAD_NAME  

static char mark_label[64] = "pmain-Nuwa";
#define SEPARATOR_LINE "----------------------------------"
#define LONNG_LINE = "------------------------------------------------------------------------------"
#if ENABLE_THREAD_NAME //begin of ENABLE_THREAD_NAME 
#define P_LOGI(fmt, ...) ALOGI("[%s ],tid:%u,%s,F:%s:%d,Fun:%s " fmt,(char*)get_current_threadname(), (unsigned int)gettid(),mark_label,(char*)__FILE__,__LINE__,(char*)__FUNCTION__,##__VA_ARGS__)
#else // log without thread name  
#define P_LOGI(fmt, ...) ALOGI("[%s],tid:%u,%s,F:%s:%d,Fun:%s " fmt,"", (unsigned int)gettid(),mark_label,(char*)__FILE__,__LINE__,(char*)__FUNCTION__,##__VA_ARGS__)
#endif //end of ENABLE_THREAD_NAME 
#else
#define P_LOGI(...)
#endif //end of P_DBUG
#endif //end of P_LOGI 
//------------------------------------------------------------------------------
///
//------------------------------------------------------------------------------

原因分析:以后写。。。