linuxsyscall系统调用获取线程PID

    Linux   中,每个进程有一个     pi   d,类型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,称为     ti   d。  有一个函数get  TI d()可以得到  TI d,但glibc并没有实现该函数,只能通过Linux的系统调用syscall来获取。

syscall 系统调用获取pid

linux 2.6.18版本之前的内核,在include/asm-i386/unistd.h文件中定义有7个_syscall宏,分别是:

_syscall0(  type ,name) _syscall1(  type ,name,  type 1,arg1) _syscall2(  type ,name,  type 1,arg1,  type 2,arg2) _syscall3(  type ,name,  type 1,arg1,  type 2,arg2,  type 3,arg3) _syscall4(  type ,name,  type 1,arg1,  type 2,arg2,  type 3,arg3,  type 4,arg4) _syscall5(  type ,name,  type 1,arg1,  type 2,arg2,  type 3,arg3,  type 4,arg4,  type 5,arg5) _syscall6(  type ,name,  type 1,arg1,  type 2,arg2,  type 3,arg3,  type 4,arg4,  type 5,arg5,  type 6,arg6)

其中,type表示所生成系统调用的返回值类型,name表示该系统调用的名称,typeN、argN分别表示第N个参数的类型和名称,它们的数目和_syscall后面的数字一样大。这些宏的作用是创建名为name的函数,_syscall后面跟的数字指明了该函数的参数的个数。

比如get  TI d系统调用用于获取线程的pid,使用_syscall宏定义为:

_  syscall0(pid_t,get     TI    d)

这样就定义了pid_d gettid()的函数,可以通过gettid来获得线程pid。  但是自2.6.19版本开始,_syscall宏被废除,我们需要使用syscall函数,通过指定系统调用号和一组参数来调用系统调用。  syscall函数原型为:

int syscall(int number,  ... );

其中number是系统调用号,number后面应顺序接上该系统调用的所有参数。下面是gettid系统调用的调用实例。  代码清单5.2 gettid系统调用使用实例

 1. #include     <   unistd.h     >    2. #include     <   sys     /   syscall.h     >    3. #include     <   sys     /   types.h     >    4.  5. #define  __NR_ gettid 224  6.  7. int m     ai   n(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)  #else pid_t gettid() {  return  static_cast

linuxsyscall系统调用获取线程PID_设计制作_可编程逻辑
97
18
0
94

相关资讯

  1. 1、新能源汽车驱动电机和电机控制器技术现状和发展趋势分析868
  2. 2、蓝牙推出全新架构将数十亿设备连接至物联网4005
  3. 3、“新基建”风潮再起,机器人企业如何巧借东风顺势而为?185
  4. 4、5G基站带来新一轮增长连接器厂家如何把握良机4617
  5. 5、比亚迪荣获巴西光伏组件&amp;amp;逆变器排名前三甲488
  6. 6、工业互联网的意义绝不仅仅是互联4824
  7. 7、WiFi几乎攻占了全世界为何折戟智能家居?860
  8. 8、深度浅析智能医疗的未来发展趋势4439
  9. 9、融资2.8亿,沈阳机床转型之路能否“自救”?1700
  10. 10、美的集团:关于收购北京合康新能科技股份有限公司控股权的提示性公告3493
全部评论(0)
我也有话说
0
收藏
点赞
顶部