Linux-进程

张开发
2026/5/4 22:17:20 15 分钟阅读

分享文章

Linux-进程
目录一、基本概念1.1 什么是进程1.2 进程 vs 程序二、为什么需要进程核心目的2.1 单片机 vs 操作系统2.2 并发与并行三、进程的组成3.1 C 程序内存布局5 个区3.2 进程 PCB 内存空间PCBProcess Control Block进程控制块包含进程的所有管理信息四、进程的状态4.1 三态模型4.2 Linux 进程状态ps 命令显示五、进程相关命令5.1 查看进程5.2 控制进程六、进程创建 —— fork()6.1 函数原型6.2 功能6.3 返回值6.4 重要特性七、exec 函数族 —— 执行新程序7.1 为什么需要 exec7.2 exec 函数族7.3 示例execvp八、进程退出8.1 退出方式8.2 exit() vs _exit()九、进程资源回收 —— wait / waitpid9.1 僵尸进程 vs 孤儿进程9.2 wait() 函数状态判断宏9.3 waitpid() 函数更灵活进程生命周期重要函数速查一、基本概念1.1 什么是进程进程是正在进行中的程序是程序的一次执行过程是程序的执行实例1.2 进程 vs 程序二、为什么需要进程核心目的提高 CPU 利用效率实现多任务处理。2.1 单片机 vs 操作系统单片机单道程序只能运行一个程序while(1){}操作系统多道程序可同时运行多个程序2.2 并发与并行宏观并行用户角度看多个程序“同时”运行微观串行CPU 在多个进程间快速切换时间片轮转每个进程获得一小段 CPU 时间如 10~100ms分时复用通过调度算法让多个进程看起来同时运行三、进程的组成3.1 C 程序内存布局5 个区3.2 进程 PCB 内存空间PCBProcess Control Block进程控制块包含进程的所有管理信息进程 IDPID进程状态就绪、运行、阻塞等程序计数器PCCPU 寄存器内存管理信息I/O 状态信息四、进程的状态4.1 三态模型就绪态Ready等待 CPU 调度执行态Running正在 CPU 上运行阻塞态Blocked等待事件如 I/O 完成4.2 Linux 进程状态ps命令显示五、进程相关命令5.1 查看进程top # 动态查看进程CPU、内存使用等 ps aux | grep a.out # 查看特定进程快照 ps -eLf | grep a.out # 查看 PID 和 PPID父进程 ID pstree -sp pid # 查看进程树及父子关系5.2 控制进程kill -l # 查看所有信号 kill -9 pid # 强制杀死SIGKILL kill -19 pid # 暂停SIGSTOP kill -18 pid # 继续SIGCONT killall a.out # 按名称杀死所有同名进程六、进程创建 ——fork()6.1 函数原型#include sys/types.h #include unistd.h pid_t fork(void);6.2 功能复制调用进程父进程创建新进程子进程子进程是父进程的副本但有独立的内存空间6.3 返回值父进程返回子进程的 PID 0子进程返回 0失败返回 -1基本用法pid_t pid fork(); if (pid 0) { perror(fork fail); return -1; } if (pid 0) { // 父进程逻辑 } else if (pid 0) { // 子进程逻辑 }6.4 重要特性执行顺序不确定由操作系统调度决定独立内存空间数据互不影响写时复制共享代码段父子进程执行相同代码文件描述符继承子进程继承父进程打开的文件多次 fork 进程数计算面试题第一次 fork → 2 个进程父 子1 第二次 fork → 4 个进程父、子1 各自 fork 一次 规律n 次 fork → 2^n 个进程循环创建多个子进程关键for (int i 0; i n; i) { pid fork(); if (pid 0) { perror(fork fail); return -1; } if (pid 0)break; // 子进程立即跳出避免子进程再 fork } // 用 i 的值区分每个子进程的任务七、exec 函数族 —— 执行新程序7.1 为什么需要 execfork后子进程执行与父进程相同代码若想执行完全不同程序需用exec7.2 exec 函数族#include unistd.h int execl(const char *path, const char *arg, ...); // 参数逐个列出 int execv(const char *path, char *const argv[]); // 参数用数组 int execlp(const char *file, const char *arg, ...); // 在 PATH 中查找 int execvp(const char *file, char *const argv[]); // 数组 PATH 查找7.3 示例execvpchar *arg[] {ls, -l, ., NULL}; execvp(ls, arg); // 无需完整路径⚠️exec成功后不返回当前进程代码段被替换八、进程退出8.1 退出方式正常退出return 0、exit()、_exit()异常退出收到信号如 SIGKILL、调用abort()8.2exit()vs_exit()九、进程资源回收 ——wait/waitpid9.1 僵尸进程 vs 孤儿进程类型定义危害处理方式孤儿进程父进程先结束子进程还在运行无危害被 initPID1收养僵尸进程子进程已结束父进程未回收其 PCB占用 PID 和内存资源必须用wait回收9.2wait()函数#include sys/wait.h pid_t wait(int *wstatus); // 阻塞等待任意子进程退出状态判断宏WIFEXITED(wstatus) // 是否正常退出 WEXITSTATUS(wstatus) // 获取退出状态码0~255 WIFSIGNALED(wstatus) // 是否被信号终止 WTERMSIG(wstatus) // 获取终止信号编号9.3waitpid()函数更灵活pid_t waitpid(pid_t pid, int *wstatus, int options);pid 0等待指定 PID 的子进程options WNOHANG非阻塞立即返回进程生命周期1.创建fork→ 2.执行子承父业 or exec 自立门户→ 3.退出exit→ 4.回收wait/waitpid重要函数速查

更多文章