Linux下获取线程TID的方法——gettid()
(转载)http://blog.csdn.net/delphiwcdj/article/details/8476547
如何获取进程的PID(process ID)?
可以使用:
- #include <unistd.h>
- pid_t getpid(void);
通过查看头文件说明,可以得到更详细的信息:
- find /usr/include -name unistd.h
- /usr/include/asm/unistd.h
- /usr/include/bits/unistd.h
- /usr/include/linux/unistd.h
- /usr/include/sys/unistd.h
- /usr/include/unistd.h
- cat /usr/include/unistd.h | grep getpid
- /* Get the process ID of the calling process. */
- 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的方式是:
- #include <sys/syscall.h>
- printf("The ID of this thread is: %ld\n", (long int)syscall(224));
或者比较elegant的方式是:
- #include <sys/syscall.h>
- #define gettidv1() syscall(__NR_gettid)
- #define gettidv2() syscall(SYS_gettid)
- printf("The ID of this thread is: %ld\n", (long int)gettidv1());// 最新的方式
- 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>。
- // /usr/include/bits/syscall.h
- #define SYS_gettid __NR_gettid
- #ifndef _LIBC
- /* The Linux kernel header file defines macros `__NR_<name>', but some
- programs expect the traditional form `SYS_<name>'. So in building libc
- we scan the kernel's list and produce <bits/syscall.h> with macros for
- all the `SYS_' names. */
- # include <bits/syscall.h>
- #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下获取线程TID的方法——gettid()的更多相关文章
- Linux下获取线程TID的方法
如何获取进程的PID(process ID)? 可以使用: #include <unistd.h> pid_t getpid(void); 通过查看头文件说明,可以得到更详细的信息: fi ...
- linux下获取线程号
#include <sys/syscall.h> pid_t gettid() { return syscall(SYS_gettid); }
- Linux获取线程tid线程名
Linux获取线程tid线程名 1 2 3 4 5 6 //thread name char cThreadName[32] = {0}; prctl(PR_GET_NAME, (unsigned l ...
- Linux下查看线程数的几种方法汇总
Linux下查看线程数的几种方法汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux下查看某个进程的线程数量 pstree命令以树状图显示进程间的关系(display ...
- 在Windows及Linux下获取毫秒级运行时间的方法
在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL W ...
- linux下获取占用CPU资源最多的10个进程
linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...
- linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:
linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...
- Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches
Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches 频繁的文件访问会导致系统的Cache使用量大增 $ free -m total used free shared ...
- Linux下Git和GitHub使用方法总结
来源:Linux下Git和GitHub使用方法总结 1 Linux下Git和GitHub环境的搭建 第一步: 安装Git,使用命令 “sudo apt-get install git” 第二步: 到G ...
随机推荐
- JAVA并发实现二(线程中止)
package com.subject01; public class InterruptDemo { public static void main(String[] args) { SimpleT ...
- poj 3692 Kindergarten (最大独立集之逆匹配)
Description In a kindergarten, there are a lot of kids. All girls of the kids know each other and al ...
- PC-CSS-多浏览器支持HTML5
非IE:article, section, aside, hgroup, nav, header, footer, figure, figcaption {display: block;}IE:< ...
- Opencv 简单的图片显示
#include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\cxcore.h> int ...
- Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据
使用ListView过程中,如果滚动加载数据的操作比较费时,很容易在滚屏时出现屏幕卡住的现象,一个解决的办法就是不要在滚动时加载数据,而是等到滚动停止后再进行数据的加载.这同样要实现OnScrollL ...
- 选中CheckBoxList的值放到TextBox中,再次选中从textBox中删除
当选中checkboxlist中的值,直接放到文本框中,在checkboxlist的SelectedIndexChanged事件下执行方法, //将选中的值放到文本框中 ...
- jquery cookie 删除不了的处理办法
$.cookie(name, null);$.cookie(name, null, {path : "/"}); Jquery Cookie的值直接设置null,并不能直接删除Co ...
- Oracle复杂查询
1:列出所有员工的姓名,部门名称,和工资 select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno = a2.deptno ...
- 基于注释的Spring Security实战
一.准备工作 预准备的工具及软件有: 1. Eclipse IDE:我使用Eclipse JEE 3.7版,即eclipse-jee-indigo-SR2-win32-x86_64.zip 2. JD ...
- [转]hibernate主键生成策略
1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识使用SQL Server 和 MySQL 的 ...