获取线程名:自己封装prctl,或使用pthread_getname_np

本文详细介绍了如何在Linux环境下使用prctl和pthread_getname_np函数获取当前线程的名称,以及如何通过pthread_setname_np函数来设置线程名称。同时,文章提供了具体的代码示例,展示了这些函数的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.csdn.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 
//------------------------------------------------------------------------------
///
//------------------------------------------------------------------------------

原因分析:以后写。。。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值