在Linux系统中,进程的状态(STAT)由多个字符组成,每个字符代表不同的信息。以下是常见的进程状态标识符及其含义:
主要状态标识符
- R: Running or runnable (on run queue) - 正在运行或处于可运行状态。
- S: Interruptible sleep (waiting for an event to complete) - 可中断睡眠(等待某个事件完成)。
- D: Uninterruptible sleep (usually I/O) - 不可中断睡眠(通常是等待I/O操作)。
- T: Stopped by job control signal - 被作业控制信号停止。
- Z: Defunct (“zombie”) process, terminated but not reaped by its parent - 僵尸进程,已终止但尚未被父进程回收。
- X: Dead (should never be seen) - 死亡状态(不应出现)。
扩展状态标识符
除了主要状态标识符外,进程状态还可以包含其他字符,提供额外的信息:
- <: High-priority (not nice to other users) - 高优先级。
- N: Low-priority (nice to other users) - 低优先级。
- L: Has pages locked into memory (for real-time and custom I/O) - 具有锁定在内存中的页面(用于实时和自定义I/O)。
- L: Has pages locked into memory (for real-time and custom I/O) - 具有锁定在内存中的页面(用于实时和自定义I/O)。
- s: Is a session leader - 会话领导。
- l: Is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) - 是多线程的(使用 CLONE_THREAD,如 NPTL pthreads)。
- +: Is in the foreground process group - 位于前台进程组。
组合示例
组合状态表示进程的多种状态属性,例如:
- Ss: 一个会话领导,处于可中断睡眠状态。
- R+: 一个处于可运行状态且在前台进程组中的进程。
- Dl: 一个不可中断的睡眠状态且多线程的进程。
查看进程状态
使用 ps
命令可以查看进程的状态,示例如下:
ps -eo pid,stat,cmd
输出示例:
PID STAT CMD
1234 Ss /sbin/init
2333 R+ /usr/bin/bash
1145 Dl /usr/bin/io_intensive_task
在这个示例中:
- 进程 1234 是一个会话领导(
s
),处于可中断睡眠状态(S
)。 - 进程 5678 处于可运行状态(
R
),在前台进程组中(+
)。 - 进程 9101 处于不可中断睡眠状态(
D
),且是多线程的(l
)。
在Linux中,进程的挂起、激活、阻塞和运行可以通过发送信号和执行命令来控制。以下是一些常见的方法和示例:
1. 挂起进程
挂起一个进程可以使用 SIGSTOP
信号。这将使进程停止运行,直到收到继续执行的信号。
kill -SIGSTOP <pid>
其中,<pid>
是你想要挂起的进程的进程ID。
2. 激活(恢复)进程
激活一个被挂起的进程可以使用 SIGCONT
信号。这将使进程从挂起状态恢复到运行状态。
kill -SIGCONT <pid>
3. 阻塞进程
阻塞进程通常是指进程在等待某个事件(如I/O操作)完成时进入的状态。在代码中,通常通过调用系统调用来实现,如 read()
、write()
、sleep()
等。这些操作不需要手动发送信号,只要进程尝试执行这些操作就会自动进入阻塞状态。
示例:阻塞进程等待输入
创建一个简单的C程序,演示进程如何因等待输入而阻塞:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Waiting for input...\n");
char buffer[100];
read(STDIN_FILENO, buffer, sizeof(buffer));
printf("Input received: %s\n", buffer);
return 0;
}
编译并运行这个程序:
gcc -o block_example block_example.c
./block_example
在你输入内容并按回车之前,进程会一直处于阻塞状态。
4. 运行进程
运行进程是指进程正在被CPU执行。在Linux系统中,当一个进程处于可运行状态时,它会被调度器分配CPU时间片。如果进程已经在运行,则不需要额外操作。如果进程因某种原因被挂起或阻塞,可以通过发送 SIGCONT
信号来恢复运行。