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


如何获取进程的PIDprocess 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

差值平方和匹配_机器学习实战 | 简单目标识别与意图分析之模板匹配

(点击上方快速关注并设置为星标&#xff0c;一起学Python)一天&#xff0c;我正在学校楼下撸猫&#xff0c;同学发来消息&#xff0c;他的老师给了他一个研究课题&#xff0c;大致的方向是对图片或者视频里面的内容进行识别&#xff0c;然后判断意图&#xff0c;而且举了个例子…

python切片操作的几种格式_【Python杂记】第四篇:序列切片

使用python处理问题的过程中&#xff0c;经常会遇到从某个序列中抽取部分值的情况。“切片”操作正是专门用于实现这一目的的方法。 实际上&#xff0c;可以通过单次或多次切片操作实现任意目标值切取。切片操作的基本语法很简单&#xff0c;下面就以列表来举例&#xff0c;说明…

grep用法

命令选项-?同时显示匹配行上下的&#xff1f;行&#xff0c;如&#xff1a;grep -2 pattern filename同时显示匹配行的上下2行。-a, --text等价于匹配text,用于&#xff08;Binary file (standard input) matches&#xff09;报错-b&#xff0c;--byte-offset打印匹配行前面打…

vector利用swap()函数进行内存的释放

首先&#xff0c;vector与deque不同&#xff0c;其内存占用空间只会增长&#xff0c;不会减小。比如你首先分配了10,000个字节&#xff0c;然后erase掉后面9,999个&#xff0c;则虽然有效元素只有一个&#xff0c;但是内存占用仍为10,000个。所有空间在vector析构时回收。 1、…

SAP常用术语

SD 常用术语汇集 SD (Sales and Distribution) : 销售和分销 Sold-to-party : 下订单客户 Ship-to-party : 收货之客户 Bill-to-party : 仅指收发票之客户 Payer-to-party : 付款人 Customer Code : 客户代码 Sales Organization : 销售业务组织&#xff0c;指台达的某一事业部…

如何创建_如何创建自己的微信圈子?圈子创建运营指南

原创&#xff1a;爱捣鼓的猿 袁小猴最近很多小伙伴在问微信圈子是什么&#xff0c;如何才能创建自己的微信圈子&#xff1f;于是小编花时间去研究了下&#xff0c;整理了一些微信圈子的规则&#xff0c;方便大家使用。一、微信圈子是什么&#xff0c;圈子入口&#xff1f;其实曾…

python爬虫淘宝评论_Python爬取淘宝店铺和评论

1 安装开发需要的一些库(1) 安装mysql 的驱动&#xff1a;在Windows上按winr输入cmd打开命令行&#xff0c;输入命令pip install pymysql&#xff0c;回车即可。(2) 安装自动化测试的驱动selenium&#xff1a;在命令行中输入pip install selenium回车。(3) 安装标签解析库pyque…

A20 网卡驱动分析

网卡芯片为realteak 8201 1. net_device结构体的分配和注册 1) "/drivers/net/ethernet/sun7i/sun7i_wemac.c" wemac_probe() ndev alloc_etherdev(sizeof(struct wemac_board_info)); 分配 ret register_netdev(ndev); …

安装用户debian7安装oracle11g

改章节笔者在北京游玩的时候突然想到的...这几周就有想写几篇关于安装用户的笔记&#xff0c;所以回家到之后就奋笔疾书的写出来发表了 apt-get install gcc g make binutils libc6 libc6-dev libstdc6 libstdc5 rpm gawk alien ksh lesstif2 libaio1 linux-headers elfutils…

python交互式编程客户端_【python】UDP网络编程:实现服务端与客户端的交互、简单的AI智能模式...

关于UDP网络编程UDP(user datagram protocol)的中文叫用户数据报协议&#xff0c;属于传输层。UDP是面向非连接的协议&#xff0c;它不与对方建立连接&#xff0c;而是直接把要发的数据发给对方。【UDP网络编程的特点】1&#xff0c;每个数据中都给出了完整的地址信息&#xff…

python tkinter pack 同一行_用python tkinter中的一行连接2个复选按钮

我有一个程序在画布中放置复选按钮&#xff0c;当选项(另一个复选按钮)被选中时。我有另一个选项(另一个复选按钮)来画线。为了画线&#xff0c;首先我应该选择checkbutton“draw a line”&#xff0c;然后单击放置在画布中的任何checkbutton&#xff0c;另一个单击画布上的任何…

各个层次的gcc警告

各个层次的gcc警告 从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attribute__ ((unused)); 指定该变量为"未使用的".即使这个变量没有被使用,编译时也会忽略则个警告输出. 文件级:在源代码文件中诊断(忽略/警告) 语法: #pragma GCC diagnostic [er…

【转】C++ GetLastError() 返回值对应表

〖0〗-操作成功完成。〖1〗-功能错误。〖2〗-系统找不到指定的文件。〖3〗-系统找不到指定的路径。〖4〗-系统无法打开文件。〖5〗-拒绝访问。〖6〗-句柄无效。〖7〗-存储控制块被损坏。〖8〗-存储空间不足&#xff0c;无法处理此命令。〖9〗-存储控制块地址无效。〖10〗-环境错…

hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...

今天梦翔儿&#xff0c;成功实现hadoop编程&#xff0c;将本地文件夹中多个文件&#xff0c;合并为一个文件并上传到hdfs中直接上代码&#xff1a;PutMerge.javaimport java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataIn…

js 获取鼠标在画布的位置_云凤蝶如何打造媲美 sketch 的自由画布

在 Design Tools 中&#xff0c;组件间的对齐与吸附功能是否好用是决定其画布是否可以高效进行产品设计的关键因素。云凤蝶作为一款快速制作高品质中后台应用的 hpaPaaS 平台&#xff0c;同样拥有自由拖拽的可视化画布。那么在云凤蝶的自由画布中&#xff0c;对齐规则是怎样的&…

GCC 使用摘记

1. 几个子程序和说明cc1C 的实际编译程序cc1plusC 的实际编译程序collect2在不使用 GNU连接程序的系统上&#xff0c;用来产生特定的全局初始化代码crt0.o为每个系统定制的初始化和结束代码libgcc默认连接的 gcc 例程库libstdc默认连接的 g 例程库 2. 几个重要的和 GCC 协同工作…

不愿意和别人打交道_如果你的交际能力很差,不喜欢与人打交道,这3种职业最适合你...

现在给个飞速发展的社会&#xff0c;在我们日常生活中交际表达能力非常的重要&#xff0c;但是还是有一部分人比较内向&#xff0c;不善于表达自己的内心&#xff0c;也不喜欢和别人接触&#xff0c;那么这一类人从事哪些行业比较合适呢&#xff1f;下面我就跟大家讨论一下。性…

python组合函数_Python---函数---参数组合

# 参数组合# 在Python中定义函数&#xff0c;可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数# 这5中都可以组合使用# 参数定义的顺序必须是&#xff1a;必选参数、默认参数、可变参数、命名关键字参数和关键字参数# 比如定义一个函数&#xff0c;包含上述若干…

Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

在移植内核的时候&#xff0c;通常会遇到引脚复用&#xff08;MUX&#xff09;的配置问题。在现在的Linux内核中&#xff0c;对于TI的ARM芯片&#xff0c;早已经有了比较通用的MUX配置框架。这对于许多TI的芯片都是通用的&#xff0c;这次看AM335X的代码顺手写一下分析&#xf…

python生成验证码_python之验证码生成(gvcode与captcha)

今天向大家总结一下python在做项目时用到的验证码生成工具&#xff1a;gvcode与captchagvcode全称&#xff1a;graphic-verification-code安装&#xff1a;pip install gvcode使用&#xff1a;import gvcodes, v gvcode.generate() #序列解包s.show() #显示生成的验证码图片pr…