C高级:Linux进程基础学习记录 在操作系统中进程Process是程序的一次动态执行过程也是系统进行资源分配和调度的基本单位。与静态的程序代码不同进程包含了程序代码、当前活动如程序计数器的值、处理器寄存器的状态、堆栈数据以及分配给它的系统资源如打开的文件、内存空间等。简而言之进程是一个“正在运行中的程序实例”。以下是我在职坐标的学习记录1. 查看所有进程详细信息的指令在 Linux 系统中最常用的查看进程信息的命令是ps。要获取系统中所有进程的详细信息通常使用以下两种格式ps aux这是 BSD 风格的命令常用于查看系统中所有用户的进程并显示详细的资源占用情况。ps -e u查看全部进程的完整信息 (-e显示所有进程;u显示完整信息)2. 常见头部字段解释执行上述ps命令后输出结果通常包含多个列以下是几个核心字段的含义USER启动该进程的用户账户名称。PID进程 IDProcess ID是操作系统为每个进程分配的唯一标识符。PPID父进程 IDParent Process ID即创建该进程的父进程的 PID。%CPU / %MEM分别表示该进程占用的 CPU 时间百分比和物理内存百分比。STAT进程当前的状态如 R 表示运行S 表示休眠Z 表示僵尸进程等。VSZ虚拟内存占用大小RSS:物理内存占用大小TTY终端编号START开始时间END运行时间COMMAND启动该进程的命令名称及其参数。3. 任务控制与进程切换jobs命令的功能jobs命令用于列出当前 Shell 会话中正在后台运行或已暂停的任务及其状态。它仅对当前终端会话有效。前后台进程切换Linux 提供了灵活的机制来在后台和前台之间切换进程暂停进程在前台运行的进程中按下Ctrl Z可以将其暂停挂起并放入后台。后台恢复 (bg)使用bg %job_number可以让一个被暂停的后台任务继续在后台运行。前台恢复 (fg)使用fg %job_number可以将后台任务无论是运行中还是暂停状态调回前台继续执行。杀死进程 (kill命令)当需要强制终止一个进程时可以使用kill命令。它通过向进程发送信号Signal来实现控制常规终止kill PID默认发送 SIGTERM 信号允许进程进行清理后退出。强制终止kill -9 PID发送 SIGKILL 信号强制立即终止进程进程无法捕获或忽略该信号。4. 进程三态图进程在生命周期中会在以下三种基本状态之间转换运行态Running进程正在 CPU 上执行指令。就绪态Ready进程已具备运行条件正在等待 CPU 的调度分配。阻塞态Blocked / Waiting进程因等待某个事件如 I/O 操作完成、等待信号量等而暂时无法执行。状态转换逻辑就绪态 → 运行态被操作系统调度程序选中分配 CPU。运行态 → 就绪态时间片用完或被更高优先级的进程抢占。运行态 → 阻塞态主动请求 I/O 或等待某事件。阻塞态 → 就绪态等待的事件已完成重新具备运行条件。5. 核心系统调用在 C 语言中Linux 通过以下系统调用来实现进程的创建、执行与同步。5.1fork()创建新进程pid_t fork(void);函数作用 通过复制当前进程父进程创建一个几乎完全相同的新进程子进程。子进程拥有独立的 PID、独立的内存空间写时复制 COW但继承了父进程的文件描述符、环境变量等。参数无。返回值关键父进程中返回子进程的 PID大于 0。子进程中返回0。失败时返回-1并设置errno。代码逻辑示例pid_t pid fork(); if (pid 0) { /* 错误处理 */ } else if (pid 0) { /* 子进程执行逻辑 */ } else { /* 父进程执行逻辑 */ }5.2execlp()执行新程序int execlp(const char *file, const char *arg, ... /* (char *) NULL */);函数作用 用参数指定的新程序替换当前进程的映像。调用成功后原进程代码不再执行而是从新程序的main开始若失败则返回 -1。参数详解file要执行的可执行文件名。p后缀表示会在环境变量PATH中自动搜索路径。arg新程序的参数列表。第一个参数必须是文件名本身即argv[0]。...后续参数必须以 (char *)NULL 结尾。示例// 相当于执行: ls -l /home execlp(ls, ls, -l, /home, (char *)NULL);5.3wait()回收子进程pid_t wait(int *status);函数作用 父进程调用后会阻塞直到任意一个子进程终止。用于获取子进程退出状态并释放其内核资源防止僵尸进程。参数详解status若非NULL内核会将子进程的退出状态写入该整型变量。需使用宏解析WIFEXITED(status)判断是否正常退出WEXITSTATUS(status)获取退出码。若WIFSIGNALED(status)为真则子进程被信号杀死用WTERMSIG(status)获取信号值。返回值成功终止子进程的PID。失败-1如没有子进程时返回ECHILD。5.4waitpid()精确等待pid_t waitpid(pid_t pid, int *status, int options);函数作用wait()的增强版支持等待指定子进程且支持非阻塞模式。参数详解pid 0等待指定 PID 的子进程。-1等待任意子进程等同于wait()。0等待同进程组的任意子进程。 -1等待指定进程组的任意子进程。status同wait()用于存储退出状态。options0阻塞等待同wait()。WNOHANG非阻塞。若指定子进程未结束立即返回 0不挂起父进程。返回值 0终止子进程的 PID。0使用了WNOHANG且子进程尚未结束。-1出错。6.5system()Shell 命令执行int system(const char *command);函数作用 高级库函数内部封装了fork()execl(/bin/sh, ...)waitpid()。用于在 Shell 中执行字符串命令。参数详解commandShell 命令字符串如ls -l | grep txt。若为NULL用于检测系统是否存在 Shell。返回值command为NULL非 0 表示有 Shell 可用。执行成功返回命令的退出状态需WEXITSTATUS解析。执行失败/Shell 不存在返回-1或127。安全警告 严禁在 Set-UID 程序或不可信输入中使用system()极易导致命令注入漏洞。生产环境应优先使用fork()exec家族。核心函数对比总结函数核心作用是否阻塞关键特性fork复制进程否一次调用两次返回execlp替换进程映像否成功不返回失败才返回wait回收任意子进程是防止僵尸获取退出码waitpid回收指定子进程可控支持WNOHANG非阻塞system执行 Shell 命令是方便但开销大有安全风险