摘要:Ø 每个进程有唯一的PID(进程ID),PPID(父进程ID)。
以下是关于Linux进程控制的详细讲解,涵盖关键概念、常用命令及操作示例:
一、进程基础概念
进程定义Ø 程序的一次执行实例,拥有独立的内存空间和系统资源。
Ø 每个进程有唯一的PID(进程ID),PPID(父进程ID)。
进程状态Ø R (Running):运行/就绪
Ø S (Sleeping):可中断睡眠
Ø D (Uninterruptible Sleep):不可中断睡眠(通常等待I/O)
Ø Z (Zombie):僵尸进程(已终止但未回收)
Ø 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 # 命名管道
共享内存Ø shmget, shmat, shmdt
消息队列Ø msgget, msgsnd, msgrcv
信号量Ø semget, semop
八、高级工具
strace:跟踪系统调用bash
strace -p PID # 追踪运行中进程
cgroups:资源限制bash
cgcreate -g cpu,memory:mygroup
cgexec -g cpu,memory:mygroup command
掌握这些内容后,您将能够熟练进行Linux环境下的进程监控、资源管理和程序开发。建议结合实际操作加深理解!
来源:老客数据一点号