获得线程名称:自定义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
//------------------------------------------------------------------------------
///
//------------------------------------------------------------------------------
原因分析:以后写。。。
下一篇: 了解prctl函数的详细用法