Linux C/C++ 获取进程号、线程号和设置线程名
1 前言
在Linux开发过程中,设计多线程开发时可以将进程和线程的 id 打印出来,方便开发调试和后期查问题使用,同时也包括设置线程名。
2 函数及头文件
2.1 进程ID
#include <unistd.h>
pid_t getpid(void);
2.2 线程ID
Linux中,每个进程有一个pid,类型pid_t,由getpid()取得。Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,其id空间是各个进程独立的(即不同进程中的线程可能有相同的id)。Linux中的POSIX线程库实现的线程其实也是一个进程(LWP),只是该进程与主进程(启动线程的进程)共享一些资源而已,比如代码段,数据段等。
由于 gettid() 在 glibc 中未实现该函数,因此我们自己可以通过 Linux 的系统调用 syscall 实现
#include <sys/unistd.h>
#define gettid() syscall(__NR_gettid)
/* 第二种 */
#include <sys/syscall.h>
#define gettid() syscall(SYS_gettid) // #define SYS_gettid __NR_gettid 在 sys/syscall.h 中定义
当只有一个线程的时候,返回的是pid。
2.3 设置线程名
#include <prctl.h>
prctl(PR_SET_NAME, "testThread");
// 可以通过设置 PR_GET_NAME 获取当前线程的名字
2.4 示例
需要在线程函数中调用
#include <sys/prctl.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <thread>
#include <stdio.h>
#include <string.h>
#define gettid() syscall(SYS_gettid)
void TestThreadBody(int threadNumber)
{
char szThreadName[20];
snprintf(szThreadName, 20, "testThread-%d", threadNumber);
prctl(PR_SET_NAME, szThreadName);
memset(szThreadName, 0, 20);
prctl(PR_GET_NAME, szThreadName);
printf("Thread[%s] pid:%u, tid:%u\n", szThreadName, (unsigned int)getpid(), (unsigned int)gettid());
}
int main()
{
char szThreadName[20];
prctl(PR_SET_NAME, "mainThread");
prctl(PR_GET_NAME, szThreadName);
printf("Thread[%s] pid:%u, tid:%u\n", szThreadName, (unsigned int)getpid(), (unsigned int)gettid());
std::thread(TestThreadBody, 1).detach();
std::thread(TestThreadBody, 2).detach();
std::thread(TestThreadBody, 3).detach();
return 0;
}
Linux C/C++ 获取进程号、线程号和设置线程名的更多相关文章
- Qt线程QThread简析(8个线程等级,在UI线程里可调用thread->wait()等待线程结束,exit()可直接退出线程,setStackSize设置线程堆栈,首次见到Qt::HANDLE,QThreadData和QThreadPrivate)
QThread实例代表一个线程,我们可以重新实现QThread::run(),要新建一个线程,我们应该先继承QThread并重新实现run()函数. 需要注意的是: 1.必须在创建QThread对象之 ...
- linux lsof/netstat查看进程和端口号相关命令:
本文为博主原创,未经允许不得转载: 在linux操作时,经常要查看运行的项目的进程和端口号,在这里总结了以下常用到的相关命令: 1.查看系统运行的java项目,并查看进程号 这个用到的命令为: ps ...
- windows系统获取进程的pid号并终止
,,,* delims= " %a in ('tasklist ^| findstr "AutodeskDesktopApp.exe"') do (set commitd ...
- linux 根据Pid获取 进程内容
ps -ef | grep 753 | grep -v 'grep' | awk '{print $NF}'
- Linux 通过程序名获取进程ID并Kill
#!/bin/bash pids=$(ps -ef | grep XXX| awk '{print $2}') for pid in $pids do echo $pid kill -9 $pid d ...
- Android JNI 启动线程,并设置线程名称
p.p1 { margin: 0; font: 12px Menlo; color: rgba(100, 56, 32, 1); background-color: rgba(255, 255, 25 ...
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
- linux进程管理(linux命令安装、进程生命周期、进程状态)
1 linux下如何杀掉进程 1)找到包名所占用的端口: ps aux | grep cbs_portal-1.0.1.jar(包名) 2)杀掉进程: kill 10942(端口号) PS: //-- ...
- Linux-pthread如何设置线程的优先级
设置线程优先级的函数: int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param ...
- 【高并发】通过源码深度分析线程池中Worker线程的执行流程
大家好,我是冰河~~ 在<高并发之--通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程>一文中我们深度分析了线程池执行任务的核心流程,在ThreadPool ...
随机推荐
- ngix反向代理服务器
Nginx ("engine x") 是一个高性能的HTTP 和反向代理 服务器,在大负载的情况下表现十分优秀. 1.正向代理 正向代理也是大家最常接触的到的代理模式.正向代理最大 ...
- C#读取FX5U线圈(modbusTCP)
第一步:导入所需的类库 第二步:包含命名空间 第三步:实例化modbus类 ModbusTcpNet busTcpClient = null; busTcpClient = new ModbusTcp ...
- poj 2533 LIS(最长上升序列)
***一道裸题, 思路:在g数组内往里加元素,一直扩大这个数组,每次查询的时候,用二分查找,时间复杂度O(nlog(n)) *** #include<iostream> #include& ...
- python进阶(5)--函数
文档目录: 一.函数体二.实参与形参三.返回值四.举例:函数+while循环五.举例:列表/元组/字典传递六.模块与函数的导入 ------------------------------------ ...
- java进阶(12)--8种数据包装类型、Integer、常用方法
一.基本数据类型与包装类型 8种基本数据类型,对应的包装类,父类 1.byte-->java.lang.Byte-->Number 2.short-->java.lang.Short ...
- 玩转 Helm
0. 前言 在 kubernetes 的系列文章中,我们介绍了 kubernetes 的种种概念,特性.不过对于如何部署并没有介绍,想象下如果 kubernetes 中 pod 的数量达到成百,上千, ...
- Apache ShardingSphere 实现分库分表及读写分离
本文为博主原创,未经允许不得转载: 项目demo 源码地址:https://gitee.com/xiangbaxiang/apache-shardingjdbc 1. 创建Maven项目,并配置 po ...
- 缓存选型:Redis or MemCache
★ Redis24篇集合 1 背景 互联网产品为了保证高性能和高可用性,经常会使用缓存来进行架构设计.最常用的就是使用Redis了,也有部分企业会选择使用Memcache. 所以了解 Redis 和 ...
- Kubernerts - 概览
1. Kubernerts K8s,是用于自动部署.扩容和管理容器化应用程序的开源系统 1.1 特性 自动化上线与回滚 分步骤针对应用或者配置更改上线,监控应用的运行状态同时不会终止所有实例,若出现问 ...
- Nginx reload重新加载配置文件的异常情况
Nginx reload重新加载配置文件的异常情况 背景 临近年底, 很多业务工作量都上来了. 今天同事告知, nginx的log 里面出现了大量的 too many openfiles 的提示信息. ...