Linux-c給線程取名字


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

 1 #define wtm_set_thread_name(n) ({ \
 2     char tname[THREAD_NAME_LEN + 1] = ""; \
 3     if (strlen(n) > THREAD_NAME_LEN) \
 4         log_debug("wtm_util_misc", "Thread name is too long, truncating it..."); \
 5     strlcpy(tname, n, THREAD_NAME_LEN); \
 6     int ret = 0; \
 7     if ((ret = prctl(PR_SET_NAME, tname, 0, 0, 0)) < 0) \
 8         log_debug("wtm_util_misc", "Error setting thread name \"%s\": %s", tname, strerror(errno)); \
 9     ret; \
10 })

已上為自己的代碼,下面為轉載內容。

 

為了能方便的區分一個進程中的每個線程,可以通過prctl()給每個線程取個名字。這樣在會創建多個線程的程序執行過程中,就能知道一個pid或tid對應的是哪個線程,對調試程序有一定幫助。

prctl是個系統調用,可以用來讀取和更改一個線程的屬性。其用戶態接口定義如下:

1 #include <sys/prctl.h>
2 
3 int prctl(int option, unsigned long arg2, unsigned long arg3,
4    unsigned long arg4, unsigned long arg5);

 

第一個參數option用來告訴prctl要對當前線程做什么操作,針對不同的操作,后面需要的參數個數也不同。其中用來獲取和修改當前線程名字的option是下面兩個:


PR_SET_NAME:設置當前線程的名字
PR_GET_NAME:獲得當前線程的名字

這兩個option都只需要一個參數,即用來存儲線程名的字符串。

 1 int prctl(int option, unsigned long arg2); 

對於arg2有如下要求:
PR_SET_NAME:arg2存放將要設置的線程名的字符指針,即(char *)arg2。名字的長度最大為15字節,且應該以'\0'結尾。如果傳入的字符串長度大於15字節,則字符串將被截斷。
PR_GET_NAME:arg2需要是一個已經分配空間的字符指針,且長度不小於16。prctl成功返回后,arg2被賦值為當前線程名,以'\0'結尾。
例如設置線程名:

1 char tname[16];  
2 memset(tname, 0, 16);  
3 snprintf(tname, 16, "playctrl%u", playId);  
4 prctl(PR_SET_NAME, tname);  

 

獲取線程名:

 1 char tname[16]; 2 prctl(PR_GET_NAME, tname); 

 

prctl()執行成功返回0,失敗返回-1,並設置errno。

注:prctl()只能設置/獲取當前線程的名字,在glibc 2.12之后的版本中提供了兩個擴展的接口pthread_setname_np()和pthread_getname_np(),可以在進程中設置和讀取其他線程的名字。

線程名在內核中由struct task_struct結構的comm成員保存,prctl()系統調用操作線程名也是通過操作這個成員實現的。

1 #define  TASK_COMM_LEN 16  
2   
3 struct task_struct {  
4  ...  
5  char comm[TASK_COMM_LEN];  
6  ...  
7 };  

 

從內核的task_struct結構定義以及prctl系統調用的實現也可以看出,線程名最多15個字符。

 

在/proc/PID/task/目錄下,列出了進程中的所有活動的線程,每個線程默認的名字和進程名相同,都是cmdline,通過prctl設置線程名后便可很方便的找到線程名和tid的對應關系,如果存在/proc/PID/task/tid/comm文件,里面就存放着線程名


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM