- 背景
- 解决
- 刚开始以为有难度,需要遍历整个proc/***以及/proc/***/task/***;因为拿到的是tid而非pid,该tid是由某个pid通过pthread_create或fork、clone出来的,只有找到对应的pid,才能从/proc/***/status下获取进程名;
- 但是linux下,tid和pid就是一个东西,内核中是完全不区分这两个概念(即线程和进程);体现在/proc下就是,不论tid还是pid,都可以在根目录下找到;因此直接读取/proc/tid/status文件即可获取进程名
- 当然,如果tid是由某个pid创建出来的,在/proc/pid/task是可以找到对应tid的,这也就是pstree工具的实现原理;
- 从这也可以看出,fork以及pthread_create其实最终到内核中,使用的都是一条创建路径;由此也可以看出,在linux中没有所谓的进程和线程之分,内核中,都是进程,就是一个task_struct结构体,重而进行执行调度
- 源码
void getNameByPid(pid_t pid, char *task_name) {
char proc_pid_path[BUF_SIZE];
char buf[BUF_SIZE];
sprintf(proc_pid_path,