以下是关于Linux进程控制的详细讲解,涵盖关键概念、常用命令及操作示例:
一、进程基础概念
- 进程定义
O 程序的一次执行实例,拥有独立的内存空间和系统资源。
O 每个进程有唯一的PID(进程ID),PPID(父进程ID)。
- 进程状态
O R (Running):运行/就绪
O S (Sleeping):可中断睡眠
O D (Uninterruptible Sleep):不可中断睡眠(通常等待I/O)
O Z (Zombie):僵尸进程(已终止但未回收)
O T (Stopped):暂停状态(如收到SIGSTOP)
二、进程控制命令
1. 查看进程
bash
ps aux # 查看所有进程详细信息
ps -ef # 全格式列表(含PPID)
top # 动态监控(按P按CPU排序,M按内存排序)
pstree -p # 树形显示进程关系
2. 终止进程
bash
kill -9 PID # 强制终止进程(SIGKILL)
killall httpd # 终止所有名为httpd的进程
pkill -u username # 终止对应用户的所有进程
3. 后台/前台控制
bash
command & # 后台运行
Ctrl + Z # 暂停当前进程并放入后台
jobs # 查看后台作业列表
fg %1 # 将作业1调到前台
bg %2 # 在后台继续运行作业2
nohup command & # 退出终端后仍运行(输出到nohup.out)
三、进程创建与管理(C编程)
1. fork() 创建子进程
c
#include
pid_t pid = fork();
if (pid == 0) {
// 子进程代码
} else if (pid > 0) {
// 父进程代码
} else {
// fork失败
}
2. exec() 系列函数
c
execl("/bin/ls", "ls", "-l", NULL); // 替换当前进程映像
3. 等待子进程退出
c
wait(NULL); // 阻塞等待任意子进程
waitpid(pid, &status, WNOHANG); // 非阻塞等待特定子进程
四、信号处理
常用信号
- SIGINT (2) : Ctrl+C 中断
- SIGTERM (15) : 默认终止信号
- SIGKILL (9) : 强制终止(不可捕获)
- SIGSTOP (19) : 暂停进程(不可捕获)
自定义信号处理
c
#include
void handler(int sig) {
// 处理逻辑
}
signal(SIGINT, handler); // 捕获SIGINT
五、进程优先级与调度
bash
nice -n 10 command # 启动时设置优先级(-20到19,值越大优先级越低)
renice 5 -p PID # 修改运行中进程的优先级
chrt --pid 99 PID # 设置实时调度策略(需root)
六、守护进程(Daemon)
创建步骤:
- 调用fork()创建子进程,父进程退出
- 子进程调用setsid()创建新会话
- 关闭文件描述符(如STDIN/STDOUT/STDERR)
- 改变工作目录到根目录 (chdir("/"))
- 重设文件创建掩码 (umask(0))
七、进程间通信(IPC)
- 管道(Pipe)
bash
ls | grep .txt # 匿名管道
mkfifo mypipe # 命名管道
- 共享内存
O shmget(), shmat(), shmdt()
- 消息队列
O msgget(), msgsnd(), msgrcv()
- 信号量
O semget(), semop()
八、高级工具
- strace:跟踪系统调用
bash
strace -p PID # 追踪运行中进程
- cgroups:资源限制
bash
cgcreate -g cpu,memory:mygroup
cgexec -g cpu,memory:mygroup command
掌握这些内容后,您将能够熟练进行Linux环境下的进程监控、资源管理和程序开发。建议结合实际操作加深理解!