LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4085|回复: 8

如何取得线程的PID

[复制链接]
发表于 2007-11-18 15:49:02 | 显示全部楼层 |阅读模式
我们知道linux的线程实现是轻量级进程,也就是说每个线程都会有它的pid,这个pid如何取得呢,我们用
#include <sys/types.h>
#include <sys/syscall.h>
pid_t tid = syscall(__NR_gettid);
直接用getpid是不行的,因为从linux2.4开始getpid返回的是TGID,线程组ID,线程组指的是从属于一个进程的所有线程组成的集合。
如果我们知道了某个线程对应的pid,就可以用tkill向这个线程发信号了。
发表于 2007-11-26 02:18:50 | 显示全部楼层
你指的是LWP的ID?帮你顶;)
回复 支持 反对

使用道具 举报

发表于 2007-11-26 08:25:08 | 显示全部楼层
编程实现不知道,但是用命令行的话可以首先PS一下查看到进程ID,然后启动GDB attach这个进程ID,然后使用info thread就可以看到LWP ID了。
回复 支持 反对

使用道具 举报

发表于 2007-11-26 18:13:30 | 显示全部楼层
顶什么阿
楼主是教我们怎么取吧
回复 支持 反对

使用道具 举报

发表于 2007-11-26 18:18:14 | 显示全部楼层
这样可移植性就降低了吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-26 20:36:01 | 显示全部楼层
是啊,可移植性会下降。
回复 支持 反对

使用道具 举报

发表于 2007-11-28 10:45:56 | 显示全部楼层
NPTL 的话用 POSIX 方法就可以了吧?
回复 支持 反对

使用道具 举报

发表于 2007-12-8 20:27:44 | 显示全部楼层
POSIX: pthread_t pthread_self() => Windows: DWORD GetCurrentThreadID()

most platform: typedef unsigned int pthread_t
回复 支持 反对

使用道具 举报

发表于 2007-12-8 23:49:50 | 显示全部楼层
抱歉没看清楚你的问题。得到NPTL线程的pid方法如下:

struct pthread_int
{
void *skip[18];
pid_t tid;
};

struct pthread_int * pt = (struct pthread_int *) pthread_self();
pt->tid 就是线程的pid,你可以拿这个pt->tid向线程用tkill发信号。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表