ps 里可以通过线程名是否包括 中括号 来判断是否为内核线程。
如下:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19360 704 ? Ss Nov17 0:06 /sbin/init
root 2 0.0 0.0 0 0 ? S Nov17 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Nov17 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S Nov17 0:10 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Nov17 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S Nov17 0:03 [watchdog/0]
root 7 0.0 0.0 0 0 ? S Nov17 2:40 [events/0]
root 8 0.0 0.0 0 0 ? S Nov17 0:00 [cgroup]
root 9 0.0 0.0 0 0 ? S Nov17 0:00 [khelper]
ps 代码里是通过查看 /proc/pid/cmdline 来进行判断,如果为空则追加 中括号 。
代码调用过程如下:
int escape_command(char *restrict const outbuf, const proc_t *restrict const pp, int bytes, int *cells, unsigned flags){
int overhead = 0;
int end = 0;
if(flags & ESC_ARGS){
const char **lc = (const char**)pp->cmdline;
if(lc && *lc) return escape_strlist(outbuf, lc, bytes, cells);
}
#0 escape_strlist (dst=0x7ffff1cf3090 " 0:06", src=0x641a00, bytes=131072, cells=0x7fffffffdcb4) at proc/escape.c:167
#1 0x00007ffff7bad403 in escape_command (outbuf=0x7ffff1cf3090 " 0:06", pp=0x7fffffffe010, bytes=131072, cells=0x7fffffffdcb4, flags=7)
at proc/escape.c:189
#2 0x0000000000404dc8 in pr_args (outbuf=0x7ffff1cf3090 " 0:06", pp=0x7fffffffe010) at ps/output.c:348
#3 0x0000000000407c66 in show_one_proc (p=0x7fffffffe010, fmt=0x639330) at ps/output.c:1854
#4 0x000000000040226a in simple_spew () at ps/display.c:341
#5 0x0000000000402c5b in main (argc=2, argv=0x7fffffffe498) at ps/display.c:593