Linux下获取线程TID的方法——gettid() 获取进程 getpid()

转载 2015年11月19日 20:36:44

如何获取进程的PID(process ID)?

可以使用:

  1. #include <unistd.h>  
  2. pid_t getpid(void);  
通过查看头文件说明,可以得到更详细的信息:
  1. find /usr/include -name unistd.h  
  2.   
  3. /usr/include/asm/unistd.h  
  4. /usr/include/bits/unistd.h  
  5. /usr/include/linux/unistd.h  
  6. /usr/include/sys/unistd.h  
  7. /usr/include/unistd.h  
  8.   
  9. cat /usr/include/unistd.h | grep getpid  
  10.   
  11. /* Get the process ID of the calling process.  */  
  12. extern __pid_t getpid (void) __THROW;  

如何获取线程的TID(thread ID)?

通过查看man得到如下描述:
(1) The gettid() system call first appeared on Linux in kernel 2.4.11.
(2) gettid() returns the thread ID of the current process. This is equal to the process ID (as returned by getpid(2)), unless the process is part of a thread group (created by specifying the CLONE_THREAD flag to the clone(2) system call). All processes in the same thread group have the same PID, but each one has a unique TID.
(3) gettid() is Linux specific and should not be used in programs that are intended to be portable. (如果考虑移植性,不应该使用此接口)

但是根据man的使用说明,测试后发现会报找不到此接口的错误“error: undefined reference to `gettid'”,通过下面链接可以找到更详细的说明:
http://www.kernel.org/doc/man-pages/online/pages/man2/gettid.2.html
(1) Glibc does not provide a wrapper for this system call; call it using syscall(2).(说明Glibc并没有提供此接口的声明,此接口实际使用的是系统调用,使用者可以自己创建包裹函数)
(2) The thread ID returned by this call is not the same thing as a POSIX thread ID (i.e., the opaque value returned by pthread_self(3)).

然后查看/usr/include/sys/syscall.h(实际在/usr/include/asm/unistd.h)可以找到我们需要的system call number:
#define __NR_gettid     224

因此,要获取某个线程的TID,最nasty的方式是:

  1. #include <sys/syscall.h>  
  2. printf("The ID of this thread is: %ld\n", (long int)syscall(224));  
或者比较elegant的方式是:
  1. #include <sys/syscall.h>  
  2. #define gettidv1() syscall(__NR_gettid)  
  3. #define gettidv2() syscall(SYS_gettid)  
  4. printf("The ID of this thread is: %ld\n", (long int)gettidv1());// 最新的方式  
  5. printf("The ID of this thread is: %ld\n", (long int)gettidv2());// traditional form  
PS: 在/usr/include/sys/syscall.h中可以看到关于__NR_<name>和SYS_<name>两个宏的区别,实际最后使用的都是__NR_<name>。
  1. // /usr/include/bits/syscall.h  
  2. #define SYS_gettid __NR_gettid  
  3.   
  4. #ifndef _LIBC  
  5. /* The Linux kernel header file defines macros `__NR_<name>', but some      
  6.    programs expect the traditional form `SYS_<name>'.  So in building libc 
  7.    we scan the kernel's list and produce <bits/syscall.h> with macros for 
  8.    all the `SYS_' names.  */  
  9. # include <bits/syscall.h>  
  10. #endif  


验证TID是否正确的方法:
查看进程pid
(1) ps ux | grep prog_name
(2) pgrep prog_name 
查看线程tid
(1) ps -efL | grep prog_name
(2) ls /proc/pid/task

Linux fork和getpid语句详解

进程的定义 定义 应用程序关于某数据集合上的一次运行活动 操作系统进行资源分配和调度的基本单位 进程是程序的一次执行过程 进程是动态的,程序是静态的 同一程序同时运行于若干...
  • qq_20916555
  • qq_20916555
  • 2016年04月16日 09:07
  • 3035

Linux系统调用--getpid/getppid函数详解

【getpid/getppid系统调用】       功能描述: getpid返回当前进程标识,getppid返回父进程标识。   用法:  #include #includ...
  • z309241990
  • z309241990
  • 2014年10月07日 11:27
  • 12464

getpid()

getpid是一种函数,功能是取得进程识别码。 中文名getpid函数功能取得进程识别码 相关函数ork,kill,getpid头文件旧版本:unistd.h 目录 1函数简介2程序示例...
  • Lina_ACM
  • Lina_ACM
  • 2016年07月20日 09:54
  • 657

从getpid()开始

       这是一个非常通用的开始,就是我的”Hello world!”。我目前拥有两个可以使用的资源,分别是Linux和Solaris,条件是很不错的。我争取程序在两个环境都可以编译,并区分这两个...
  • hanyu1980
  • hanyu1980
  • 2006年02月06日 18:20
  • 2663

getpid函数

函数功能:取得进程识别码   相关函数: fork,kill,getpid   头文件: 旧版本:unistd.h,在VC++6.0下可以用process.h   函数原型: 旧的原型为pid_t g...
  • pingwang0606
  • pingwang0606
  • 2011年03月17日 18:09
  • 1909

Linux下获取线程TID的方法——gettid()

2013-01-07 wcdj 如何获取进程的PID(process ID)? 可以使用: #include pid_t getpid(void);通过查看头文件说明,可以得到更详细的...
  • delphiwcdj
  • delphiwcdj
  • 2013年01月07日 14:20
  • 32521

linux下的四个简单函数介绍:getpid, getppid, getuid, getgid

直接看程序: #include int main() { printf("pid:%d, ppid:%d, uid:%d, gid:%d\n", getpid(), getppid(), get...
  • stpeace
  • stpeace
  • 2015年04月30日 21:23
  • 6795

linux getpid 小结

copy from:  http://blog.sina.com.cn/s/blog_759dc36b0100p8y4.html 当运行任何一个UNIX命令时,shell至少会建立一...
  • zhuyi2654715
  • zhuyi2654715
  • 2012年07月19日 20:23
  • 1034

gettid和pthread_self区别

1 线程ID获取方法 linux下获取线程有两种方法: 1)gettid或者类似gettid的方法   2)直接调用pthread_self() gettid 获取的是内核中线程ID,而pthread...
  • rsyp2008
  • rsyp2008
  • 2015年04月20日 15:10
  • 5340

gettid 和pthread_self的区别

Linux中,每个进程有一个pid,类型pid_t,由getpid()取得。Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,...
  • fivedoumi
  • fivedoumi
  • 2015年04月27日 17:38
  • 4226
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下获取线程TID的方法——gettid() 获取进程 getpid()
举报原因:
原因补充:

(最多只允许输入30个字)