大家好,我是雜燴君。
嵌入式Linux開發(fā)中,有時候為了定位問題,需要查看某個進程的各個線程的運行情況。
例子
multi_thread.c:
#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
// 線程名稱最大長度
#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;
// 線程入口函數(shù)指針類型
typedef void *(*p_thread_fun)(void *param);
// 線程數(shù)據(jù)表
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...n");
while (1)
{
usleep(2 * 1000);
}
return NULL;
}
static void *test1_thread_entry(void *param)
{
printf("test1_thread running...n");
while (1)
{
usleep(2 * 1000);
}
return NULL;
}
static void *test2_thread_entry(void *param)
{
printf("test2_thread running...n");
while (1)
{
usleep(2 * 1000);
}
return NULL;
}
static void *test3_thread_entry(void *param)
{
printf("test3_thread running...n");
while (1)
{
usleep(2 * 1000);
}
return NULL;
}
static void *test4_thread_entry(void *param)
{
printf("test4_thread running...n");
while (1)
{
usleep(2 * 1000);
}
return NULL;
}
static void *test5_thread_entry(void *param)
{
printf("test5_thread running...n");
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 = %ldn", s_app_thread_table[i].name, s_app_thread_table[i].thread_handle);
return ret;
}
else
{
printf("%s thread create success! thread_id = %ldn", 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`
注意:
這里的 `號并不是單引號!?。?/p>
這里的 `號并不是單引號?。。?/p>
這里的 `號并不是單引號?。?!
這個符號在鍵盤上感嘆號!鍵的左邊。
我們先運行程序,再使用top命令查看,如:
注意,我們創(chuàng)建線程的時候需要使用 pthread_setname_np
函數(shù)設置線程的名字,否則top -H顯示不出來具體的線程。
假如我們把上例中的pthread_setname_np屏蔽掉,結果如:
可見,不調用pthread_setname_np設置線程名稱的話,top -H查看得到的各線程名稱就是進程名。
以上本次的分享,期待大家的三連支持!