linux – 识别内核线程

前端之家收集整理的这篇文章主要介绍了linux – 识别内核线程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道如何区分一个内核线程和一个用户线程,用于正在构建的进程扫描器.我很难找到两种类型的良好定义.

我发现内核线程没有自己的内存,所以/ proc / $pid / status中没有Vm *值,并且/ proc / $pid / exe上的stat不返回任何东西.

所以,我想我可以识别内核线程,如果进程没有Vm *值,没有索引节点号.我错了…我的脚本看到php-cgi进程有时被识别为内核进程.

如果发现大多数这些错误识别的进程是一秒钟后就会消失的僵尸.所以我实施了一个简单的检查,看看状态是否为“Z”.如果是这样,忽略它.
这救了我很多假阳性,但是我仍然收到关于php-cgi内核进程的消息.

任何人都可以告诉我如何区分一个内核线程和用户线程正确的方式?

解决方法

内核线程和用户空间线程之间有一些明显的区别:

> / proc / $pid / cmdline对于内核线程是空的 – 这是ps和top用来区分内核线程的方法.
> / proc / $pid / exe符号链接没有内核线程的目标 – 这是有道理的,因为它们在文件系统上没有相应的可执行文件.

更具体地说,readlink()系统调用返回ENOENT(“否这样的文件或目录”),尽管链接本身存在,以表示这个进程的可执行文件不存在(而从来没有).

因此,检查内核线程的可靠方法应该是调用/ proc / $pid / exe上的readlink(),并检查其返回码.如果成功,那么$pid是一个用户进程.如果与ENOENT失败,则/ proc / $pid / exe上的额外的stat()应该从刚刚终止的进程中分离出内核线程的情况.> / proc / $pid / status缺少大多数内核线程的几个字段 – 更具体地说是与虚拟内存相关的几个字段.

猜你在找的Linux相关文章