先来仔细分析一下,既然进程看上去被卡死,那么如果被卡在用户态,那么该进程 CPU 使用率必然很高(死循环之类);如果被卡在内核态,这时进程应该正在进行 IO 或者网络通信等,那么 CPU 使用率应该会很低,现在还能查到进程ID,有了进程ID运行 top 命令看一下:注意 CPU 那一列,显示 CPU 占用率为0%,我们发现此时该进程几乎没有占用CPU,这基本上是在告诉我们该进程是被卡死在内核态,进程要进入内核态那么就是因为调用了某个阻塞式系统调用导致被操作系统挂起,那么该怎么知道进程调用了什么系统调用呢?
让我们再仔细想一想。既然进程被卡死了,那么此时进程必然没有位于用户态,不是用户态就肯定是内核态,那么进程怎样才能进入内核态呢?答案很显然是调用了某个系统调用。那么我们该怎样知道某个进程当前正在调用哪个系统调用呢?You are lucky dog,Say hi to /proc/***/syscall,我们同样可以用简单的 cat 命令去 proc 文件系统中查找,使用/proc后跟进程ID+syscall即可。WTF。。。这是一串什么鬼东西!原来这一串看起来不知所云的东西正是系统调用,第一个数字代表系统调用 ID,后面一堆是参数,我们可以不用关心。从上面的输出我们可以看到调用的是第 262 号系统调用,只有一个数字是没什么意义的,这个数字到底代表那个系统调用呢?
根据内核源码查系统调用
要知道这个数字的含义,我们就需要参考内核代码了,一般在 Linux 系统中必要的内核头文件位于/usr/include目录,在博主 64 位 Linux 机器上,我找到了这个文件:Gotyou!!!我们可以看到调用了 newfstatat 系统调用,这个系统调用有什么作用呢?让我们再一次问男人(man命令):