strace中线程getpid()返回值与括号内PID差异的原因解析
关于strace中[pid XXX]标识的说明
strace括号里的171977是线程的轻量级进程ID(LWP ID),也就是Linux内核为每个线程分配的唯一内核级标识。
在Linux系统中,所谓的“线程”本质上是共享地址空间等资源的轻量级进程(LWP):
- 当用
clone调用携带CLONE_THREAD标志创建线程时,新线程会加入父线程的线程组,共享同一个线程组ID(TGID)——也就是你看到的getpid()返回的171280。 - 同一个线程组内的所有线程,
getpid()都会返回TGID,getppid()返回的是整个线程组的父进程ID(也就是170039)。 - 但每个线程在内核层面有独立的LWP ID,strace就是用这个ID来区分同一个线程组里的不同执行流,所以会用
[pid 171977]来标记该线程的系统调用。
你可以用ps -L <TGID>命令验证这一点,比如执行ps -L 171280,输出里的LWP列就会显示该线程组下所有线程的LWP ID,其中必然包含171977。
内容的提问来源于stack exchange,提问作者chelivery
相关产品推荐
相关产品推荐

