
1. Linux进程控制概述在Linux系统中进程控制是操作系统核心功能之一。每个运行中的程序都是一个进程而Linux提供了丰富的系统调用和命令来管理这些进程的生命周期。理解进程控制对于系统管理员和开发人员来说都是必备技能它能帮助我们优化系统性能、调试程序问题以及构建复杂的应用系统。Linux进程控制主要涉及以下几个方面进程的创建与终止进程状态的监控与管理进程间通信(IPC)进程优先级调整守护进程的管理2. 进程创建与终止机制2.1 fork()系统调用在Linux中新进程的创建主要通过fork()系统调用实现。这个调用会创建一个与父进程几乎完全相同的子进程包括代码段、数据段、堆栈段以及打开的文件描述符等。#include unistd.h #include stdio.h int main() { pid_t pid fork(); if (pid 0) { // 子进程代码 printf(Child process (PID: %d)\n, getpid()); } else if (pid 0) { // 父进程代码 printf(Parent process (PID: %d, Child PID: %d)\n, getpid(), pid); } else { // fork失败 perror(fork failed); return 1; } return 0; }fork()的一个关键特性是写时复制(Copy-On-Write)这意味着父子进程最初共享相同的物理内存页只有当任一进程尝试修改这些页时内核才会真正复制该页。2.2 exec系列函数exec系列函数用于将当前进程映像替换为一个新的程序。常见的exec函数包括execl()参数以列表形式传递execv()参数以数组形式传递execle()可指定环境变量execvp()在PATH环境变量中搜索可执行文件#include unistd.h // 使用execl执行ls命令 execl(/bin/ls, ls, -l, NULL);2.3 进程终止方式进程可以通过以下几种方式终止正常退出调用exit()或从main()返回异常退出收到未处理的信号被其他进程终止收到SIGKILL等信号exit()和_exit()的区别exit()会执行atexit()注册的函数刷新I/O缓冲区_exit()直接终止进程不做任何清理3. 进程状态监控与管理3.1 ps命令详解ps命令是查看进程状态的基本工具常用选项组合ps aux # 查看所有用户的所有进程 ps -ef # 完整格式显示所有进程 ps -l # 长格式显示当前用户进程输出字段说明USER进程所有者PID进程ID%CPUCPU占用百分比%MEM内存占用百分比VSZ虚拟内存大小(KB)RSS常驻内存大小(KB)STAT进程状态START进程启动时间COMMAND命令名称和参数3.2 top与htop实时监控top命令提供动态实时视图top -d 1 # 1秒刷新一次htop是top的增强版提供彩色显示鼠标支持垂直和水平滚动进程树视图3.3 /proc文件系统/proc是内存中的虚拟文件系统包含大量进程和系统信息cat /proc/1/status # 查看PID为1的进程状态 ls /proc/self/fd # 查看当前进程打开的文件描述符4. 进程间通信(IPC)机制4.1 管道(pipe)管道是最简单的IPC方式适用于有亲缘关系的进程#include unistd.h int pipefd[2]; pipe(pipefd); // pipefd[0]为读端pipefd[1]为写端命名管道(FIFO)允许无亲缘关系的进程通信mkfifo /tmp/myfifo4.2 共享内存共享内存是最快的IPC方式允许多个进程访问同一块内存#include sys/shm.h // 创建共享内存段 int shmid shmget(IPC_PRIVATE, size, IPC_CREAT | 0666); // 附加到进程地址空间 void *shmaddr shmat(shmid, NULL, 0); // 分离共享内存 shmdt(shmaddr); // 删除共享内存 shmctl(shmid, IPC_RMID, NULL);4.3 消息队列消息队列允许进程以消息形式交换数据#include sys/msg.h struct msgbuf { long mtype; // 消息类型 char mtext[100]; // 消息数据 }; // 创建消息队列 int msgid msgget(IPC_PRIVATE, IPC_CREAT | 0666); // 发送消息 msgsnd(msgid, msg, sizeof(msg.mtext), 0); // 接收消息 msgrcv(msgid, msg, sizeof(msg.mtext), mtype, 0);5. 进程优先级与调度5.1 nice值与优先级Linux进程优先级范围是-20(最高)到19(最低)默认值为0。nice -n 10 command # 以nice值10启动命令 renice 5 -p 1234 # 修改运行中进程(PID1234)的nice值为55.2 实时调度策略Linux支持三种调度策略SCHED_OTHER默认的时间片轮转策略SCHED_FIFO先进先出实时策略SCHED_RR轮转实时策略设置实时优先级#include sched.h struct sched_param param; param.sched_priority 50; sched_setscheduler(0, SCHED_FIFO, param);6. 守护进程与系统服务6.1 创建守护进程典型守护进程创建步骤调用fork()创建子进程父进程退出调用setsid()创建新会话再次fork()确保不是会话首进程更改工作目录到根目录重设文件权限掩码关闭所有打开的文件描述符重定向标准I/O到/dev/null#include unistd.h #include sys/stat.h #include fcntl.h void daemonize() { pid_t pid fork(); if (pid 0) exit(EXIT_FAILURE); if (pid 0) exit(EXIT_SUCCESS); // 父进程退出 // 子进程成为新会话领导 if (setsid() 0) exit(EXIT_FAILURE); // 防止重新获得控制终端 pid fork(); if (pid 0) exit(EXIT_FAILURE); if (pid 0) exit(EXIT_SUCCESS); // 更改工作目录 chdir(/); // 重设文件权限掩码 umask(0); // 关闭所有打开的文件描述符 for (int x sysconf(_SC_OPEN_MAX); x 0; x--) { close(x); } // 重定向标准I/O open(/dev/null, O_RDWR); // stdin dup(0); // stdout dup(0); // stderr }6.2 systemd服务管理现代Linux系统使用systemd管理服务systemctl start service_name # 启动服务 systemctl stop service_name # 停止服务 systemctl restart service_name # 重启服务 systemctl status service_name # 查看服务状态 systemctl enable service_name # 设置开机启动 systemctl disable service_name # 禁用开机启动7. 进程控制实战技巧7.1 进程监控脚本以下脚本监控指定进程的CPU和内存使用情况#!/bin/bash if [ $# -ne 1 ]; then echo Usage: $0 process_name exit 1 fi PROCESS$1 while true; do PID$(pgrep -o $PROCESS) if [ -z $PID ]; then echo Process $PROCESS not found sleep 1 continue fi STATS$(ps -p $PID -o %cpu,%mem,cmd --no-headers) echo $(date %Y-%m-%d %H:%M:%S) - $STATS sleep 5 done7.2 批量进程管理使用pkill和pgrep批量管理进程pkill -f python script.py # 终止所有匹配的进程 pgrep -u username # 查找用户的所有进程 pkill -SIGTERM -u username # 终止用户的所有进程7.3 进程资源限制使用ulimit和cgroups限制进程资源# 设置单个进程最大打开文件数 ulimit -n 1024 # 使用cgroups限制内存 cgcreate -g memory:/mygroup echo 100M /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes echo $PID /sys/fs/cgroup/memory/mygroup/tasks8. 常见问题排查8.1 僵尸进程处理僵尸进程是已终止但父进程未调用wait()的进程。处理方法找到僵尸进程及其父进程ps aux | grep Z向父进程发送SIGCHLD信号kill -s SIGCHLD PPID如果父进程不处理终止父进程kill -9 PPID8.2 高CPU占用排查使用top找到高CPU进程后进一步分析# 查看进程的线程CPU使用 top -H -p PID # 使用strace跟踪系统调用 strace -p PID -c # 使用perf进行性能分析 perf top -p PID8.3 内存泄漏检测使用valgrind检测内存泄漏valgrind --leak-checkfull ./program对于运行中的进程可以监控/proc/PID/smapswatch -n 1 cat /proc/PID/smaps | grep -i heap