linux c 获取进程p id,详解Linux获取线程的PID(TID、LWP)的几种方式

在 Linux C/C++ 中通常是通过 pthread 库进行线程级别的操作。

在 pthread 库中有函数:

pthread_t pthread_self(void);

它返回一个 pthread_t 类型的变量,指代的是调用 pthread_self 函数的线程的 “ID”。

怎么理解这个“ID”呢?

这个“ID”是 pthread 库给每个线程定义的进程内唯一标识,是 pthread 库维持的。

由于每个进程有自己独立的内存空间,故此“ID”的作用域是进程级而非系统级(内核不认识)。

其实 pthread 库也是通过内核提供的系统调用(例如clone)来创建线程的,而内核会为每个线程创建系统全局唯一的“ID”来唯一标识这个线程。

这个系统全局唯一的“ID”叫做线程PID(进程ID),或叫做TID(线程ID),也有叫做LWP(轻量级进程=线程)的。

如何查看线程在内核的系统全局唯一“ID”呢?大体分为以下几种方式。

测试代码:

main.c

#define _GNU_SOURCE

#include

#include

#include

#include

#include

void *start_routine(void *arg) {

char msg[32] = "";

snprintf(msg, sizeof(msg)-1, "thd%d: i am thd%d

", *((int *)arg), *((int *)arg));

while (1) {

write(1, msg, strlen(msg));

sleep(1);

}

}

int main() {

int th1 = 1;

pthread_t tid1;

pthread_create(&tid1, NULL, start_routine, &th1);

int th2 = 2;

pthread_t tid2;

pthread_create(&tid2, NULL, start_routine, &th2);

int th3 = 3;

pthread_t tid3;

pthread_create(&tid3, NULL, start_routine, &th3);

const char *msg = "main: i am main

";

while (1) {

write(1, msg, strlen(msg));

sleep(1);

}

return 0;

}

在主线程中通过 pthread 库创建三个线程,不断输出 “i am xxx” 的信息。

运行输出:

[test1280@localhos

你可能感兴趣的:(linux,c,获取进程p,id)