linux中,每个进程有一个pid,类型pid_t,由getpid()取得。linux下的posix线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,其id空间是各个进程独立的(即不同进程中的线程可能有相同的id)。linux中的posix线程库实现的线程其实也是一个进程(lwp),只是该进程与主进程(启动线程的进程)共享一些资源而已,比如代码段,数据段等。
通过pthread_self()取得的线程id实际上是当前线程的descriptor地址,其实现:
# define thread_self ({ struct pthread *__self; asm (movl %%gs:%c1,%0 : =r (__self) : i (offsetof (struct pthread, header.self))); __self;})
但有时候我们可能需要知道线程的真实pid。比如进程p1要向另外一个进程p2中的某个线程发送信号时,既不能使用p2的pid,更不能使用线程的pthread id,而只能使用该线程的真实pid,称为tid。 有一个函数gettid()可以得到tid,但glibc并没有实现该函数,只能通过linux的系统调用syscall来获取。
syscall 系统调用获取pid
linux 2.6.18版本之前的内核,在include/asm-i386/unistd.h文件中定义有7个_syscall宏,分别是:
_syscall0(type,name) _syscall1(type,name,type1,arg1) _syscall2(type,name,type1,arg1,type2,arg2) _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6)
其中,type表示所生成系统调用的返回值类型,name表示该系统调用的名称,typen、argn分别表示第n个参数的类型和名称,它们的数目和_syscall后面的数字一样大。这些宏的作用是创建名为name的函数,_syscall后面跟的数字指明了该函数的参数的个数。
比如gettid系统调用用于获取线程的pid,使用_syscall宏定义为:
_syscall0(pid_t,gettid)
这样就定义了pid_d gettid()的函数,可以通过gettid来获得线程pid。 但是自2.6.19版本开始,_syscall宏被废除,我们需要使用syscall函数,通过指定系统调用号和一组参数来调用系统调用。 syscall函数原型为:
int syscall(int number, ...);
其中number是系统调用号,number后面应顺序接上该系统调用的所有参数。下面是gettid系统调用的调用实例。 代码清单5.2 gettid系统调用使用实例
1. #include 2. #include 3. #include 4. 5. #define __nr_gettid 224 6. 7. int main(int argc, char *argv[]) 8. { 9. pid_t tid; 10. 11. tid = syscall(__nr_gettid); 12. }
大部分系统调用都包括了一个sys_符号常量来指定自己到系统调用号的映射,因此上面第10行可重写为:
tid = syscall(sys_gettid);
在内部为方便调用可以自己定义
pid_t gettid() { return static_cast
为了兼容各个内核版本可以定义
#ifdef _syscall0_syscall0(pid_t,gettid)#elsepid_t gettid() { return static_cast
2025年前全球约半数的工作将由机器完成,并催生新的工作岗位
低压综保在电机保护回路中的应用
执行成功云迁移战略的最佳实践
KT6368A蓝牙芯片的天线注意事项
OrCAD将原理图中导出并保存至器件库的详细步骤
linux syscall系统调用获取线程PID
什么是3D MEMS?三维微电子机械系统
国内EDA行业领军企业“概伦电子”获数亿元融资
电流传感器和功率计搭配如何测量变频电机效率
【干货分享】汽车以太网与TSN技术直播课问答集锦
苹果Vision Pro头显遭遇电池难题
采用电流型控制芯片UC3846实现电源交错并联时的同步运行设计
PCB设计:蛇形线背后隐藏的陷阱
机器学习需要掌握的九种工具盘点
Sub-6GHz和毫米波的区别_Sub-6GHz和毫米波应用现状
百度公司宣布全面开放ApolloRobotaxi自动驾驶出租车服务
模块电源灌封简介
iPhone7热点:整机275美元 爆炸惊动苹果介入调查
VoIP通讯原理解析
投光灯&泛光灯的双节锂电池供电方案