【进程】进程管理

查看进程

1. ps

查看某个时间点的进程信息。git

示例一:查看本身的进程github

# ps -l

示例二:查看系统全部进程shell

# ps aux

示例三:查看特定的进程函数

# ps aux | grep threadx

2. pstree

查看进程树。spa

示例:查看全部进程树blog

# pstree -A

3. top

实时显示进程信息。队列

示例:两秒钟刷新一次进程

# top -d 2

4. netstat

查看占用端口的进程事件

示例:查看特定端口的进程资源

# netstat -anp | grep port

进程状态

状态 说明
R running or runnable (on run queue)
正在执行或者可执行,此时进程位于执行队列中。
D uninterruptible sleep (usually I/O)
不可中断阻塞,一般为 IO 阻塞。
S interruptible sleep (waiting for an event to complete) 
可中断阻塞,此时进程正在等待某个事件完成。
Z zombie (terminated but not reaped by its parent)
僵死,进程已经终止可是还没有被其父进程获取信息。
T stopped (either by a job control signal or because it is being traced) 
结束,进程既能够被做业控制信号结束,也多是正在被追踪。

 

 

 

SIGCHLD

当一个子进程改变了它的状态时(中止运行,继续运行或者退出),有两件事会发生在父进程中:

  • 获得 SIGCHLD 信号;
  • waitpid() 或者 wait() 调用会返回。

其中子进程发送的 SIGCHLD 信号包含了子进程的信息,好比进程 ID、进程状态、进程使用 CPU 的时间等。

在子进程退出时,它的进程描述符不会当即释放,这是为了让父进程获得子进程信息,父进程经过 wait() 和 waitpid() 来得到一个已经退出的子进程的信息。

 

 

wait()

pid_t wait(int *status)

父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,以后 wait() 函数会销毁子进程并返回。

若是成功,返回被收集的子进程的进程 ID;若是调用进程没有子进程,调用就会失败,此时返回 -1,同时 errno 被置为 ECHILD。

参数 status 用来保存被收集的子进程退出时的一些状态,若是对这个子进程是如何死掉的绝不在乎,只想把这个子进程消灭掉,能够设置这个参数为 NULL。

waitpid()

pid_t waitpid(pid_t pid, int *status, int options)

做用和 wait() 彻底相同,可是多了两个可由用户控制的参数 pid 和 options。

pid 参数指示一个子进程的 ID,表示只关心这个子进程退出的 SIGCHLD 信号。若是 pid=-1 时,那么和 wait() 做用相同,都是关心全部子进程退出的 SIGCHLD 信号。

options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可使 waitpid() 调用变成非阻塞的,也就是说它会当即返回,父进程能够继续执行其它任务。

孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。

孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工做。

因为孤儿进程会被 init 进程收养,因此孤儿进程不会对系统形成危害。

僵尸进程

一个子进程的进程描述符在子进程退出时不会释放,只有当父进程经过 wait() 或 waitpid() 获取了子进程信息后才会释放。若是子进程退出,而父进程并无调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。

僵尸进程经过 ps 命令显示出来的状态为 Z(zombie)。

系统所能使用的进程号是有限的,若是产生大量僵尸进程,将由于没有可用的进程号而致使系统不能产生新的进程。

要消灭系统中大量的僵尸进程,只须要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养,这样 init 进程就会释放全部的僵尸进程所占有的资源,从而结束僵尸进程。

相关文章
相关标签/搜索