在嵌入式linux开发中,有时候为了定位问题,需要查看某个进程的各个线程的运行情况。
例子 multi_thread.c:
左右滑动查看全部代码>>>
#define _gnu_source#include #include #include #include // 线程名称最大长度#define app_thread_name_max_len 32// 线程索引typedef enum _app_thread_index{ app_thread_index_test0, app_thread_index_test1, app_thread_index_test2, app_thread_index_test3, app_thread_index_test4, app_thread_index_test5, app_thread_index_max}app_thread_index_e;// 线程入口函数指针类型typedef void *(*p_thread_fun)(void *param);// 线程数据表typedef struct _app_thread{ pthread_t thread_handle; p_thread_fun thread_entry; char name[app_thread_name_max_len];}app_thread_s;static void *test0_thread_entry(void *param);static void *test1_thread_entry(void *param);static void *test2_thread_entry(void *param);static void *test3_thread_entry(void *param);static void *test4_thread_entry(void *param);static void *test5_thread_entry(void *param);// 线程表app_thread_s s_app_thread_table[app_thread_index_max] ={ {0, test0_thread_entry, test0_thread}, {0, test1_thread_entry, test1_thread}, {0, test2_thread_entry, test2_thread}, {0, test3_thread_entry, test3_thread}, {0, test4_thread_entry, test4_thread}, {0, test5_thread_entry, test5_thread}};static void *test0_thread_entry(void *param){ printf(test0_thread running...); while (1) { usleep(2 * 1000); } return null;}static void *test1_thread_entry(void *param){ printf(test1_thread running...); while (1) { usleep(2 * 1000); } return null;}static void *test2_thread_entry(void *param){ printf(test2_thread running...); while (1) { usleep(2 * 1000); } return null;}static void *test3_thread_entry(void *param){ printf(test3_thread running...); while (1) { usleep(2 * 1000); } return null;}static void *test4_thread_entry(void *param){ printf(test4_thread running...); while (1) { usleep(2 * 1000); } return null;}static void *test5_thread_entry(void *param){ printf(test5_thread running...); while (1) { usleep(2 * 1000); } return null;};static int create_all_app_thread(void){ int ret = 0; for (int i = 0; i < app_thread_index_max; i++) { ret = pthread_create(&s_app_thread_table[i].thread_handle, null, s_app_thread_table[i].thread_entry, null); if (0 != ret) { printf(%s thread create error! thread_id = %ld, s_app_thread_table[i].name, s_app_thread_table[i].thread_handle); return ret; } else { printf(%s thread create success! thread_id = %ld, s_app_thread_table[i].name, s_app_thread_table[i].thread_handle); pthread_setname_np(s_app_thread_table[i].thread_handle, s_app_thread_table[i].name); } pthread_detach(s_app_thread_table[i].thread_handle); } return ret;}int main(int argc, char **argv){ create_all_app_thread(); while (1) { usleep(2 * 1000); } return 0;} 我们可以通过top命令来查看,具体做法就是要在top输出中开启线程查看,请调用top命令的“-h”选项,该选项会列出所有linux线程。
这里我们指定查看multi_thread进程的各线程运行情况,命令:
top -h -p `pidof multi_thread` 注意:这里的 `号并不是单引号!!!
这个符号在键盘上感叹号!键的左边。
我们先运行程序,再使用top命令查看,比如:
注意:我们创建线程的时候需要使用 pthread_setname_np 函数设置线程的名字,否则top -h显示不出来具体的线程。
假如我们把上例中的pthread_setname_np屏蔽掉,结果如下:
可见,不调用pthread_setname_np设置线程名称的话,top -h查看得到的各线程名称就是进程名。
以上就是本次的分享,期待大家的三连支持!
华润上华举办与京津IC设计者共迎中国‘芯’热点研讨会
c语言中的SCL-CONTIUNE语句
uPD720110a -Hub集线器控制芯片
HAL库中do{...} while(0U) 宏定义的作用和意义
iPad Pro也代替windows电脑来办公吗?和在笔记本上打字已经没有什么区别
怎么查看嵌入式Linux开发中各个线程的运行情况
基于WLAN散热问题的LDO解决方案
东风雷诺力压途观,内饰给人一种非常高档的感觉,低调而不失内涵,给人一种非常帅气的感觉
苹果已经发布了iOS 14的第7个公开测试版
什么是物联网,物联网的重要性以及特征说明
欧瑞博T1C智能门锁评测 家居与智能还有多远
解析未来AR眼镜代替手机的可行性
机器学习和信号处理 | Feel 你的情绪、想法和感受
服务器数据恢复-ESX SERVER常见故障的数据恢复方案
卓视智通顺利通过健康安全管理体系等四项认证
Power-One推出DOSA兼容的1/16砖形DC/DC转
小米MIX2最新消息:小米MIX 2为想象而来,又颠覆想象!
pcb维修视频教程
索尼又推新机:屏幕不到5英寸,搭载骁龙835处理器,还将配备Xperia_XZ_Premium相同的1900万像素摄像头!
日本三菱电机自曝向欧洲出口不合格产品