2010-10-06 48 views
1

我開發了一個在Linux機器上有一些線程的進程(Ubuntu)。我想知道如何從每個線程獲得LWP(使用glibc函數),一旦PID和PPID對於進程的所有線程都是相同的。如何使用Linux glibc獲得LWP?

UID  PID PPID LWP C NLWP STIME TTY   TIME CMD 
root  2588 2587 2588 0 11 00:05 ?  00:00:07 ./testsrv 
root  2588 2587 2589 2 11 00:05 ?  00:23:17 ./testsrv 
root  2588 2587 2590 0 11 00:05 ?  00:00:00 ./testsrv 
root  2588 2587 2591 0 11 00:05 ?  00:00:03 ./testsrv 
root  2588 2587 2592 0 11 00:05 ?  00:00:00 ./testsrv 
root  2588 2587 2593 0 11 00:05 ?  00:00:00 ./testsrv 
root  2588 2587 2594 0 11 00:05 ?  00:05:05 ./testsrv 
root  2588 2587 2595 0 11 00:05 ?  00:00:00 ./testsrv 
root  2588 2587 2596 0 11 00:05 ?  00:00:37 ./testsrv 
root  2588 2587 2597 0 11 00:05 ?  00:00:00 ./testsrv 
root  2588 2587 2601 0 11 00:05 ?  00:00:00 ./testsrv 
+0

LWP代表輕重量過程:表示一個線程。我猜你嘗試獲取線程ID – Aboelnour 2010-10-06 16:07:34

回答

5

使用gettid()從手冊頁:

說明
gettid()返回調用者的線程ID(TID)。在單線程 進程中,線程ID等於進程ID(PID,由 getpid(2)返回)。在多線程進程中,所有線程都有相同的PID,但每個線程都有一個唯一的TID。有關更多詳細信息,請參閱克隆(2)中的CLONE_THREAD的討論 。

返回值
成功時,返回調用進程的線程ID。

+1

不幸的是,我嘗試gettid()時收到錯誤消息:未定義的引用'gettid'。經過幾個小時的研究,我發現並測試了一個真正有效的多平臺解決方案:PlatformThreadId GetCurrentThreadId(void) {if defined(__ APPLE__) return mach_thread_self(); #elif defined(_LINUX) #ifdef __NR_gettid return syscall(__ NR_gettid); #else return(getpid()); #ENDIF #ENDIF } – 2010-10-07 05:39:44

+0

從手冊頁相同的: 的#define _GNU_SOURCE 的#include #包括在 的#include INT 主(INT的argc,字符* argv的[]) { pid_t tid; tid = syscall(SYS_gettid); } – Aboelnour 2010-10-07 07:26:57