Linux学习笔记3:进程和进程间通信 📅 2026/6/26 3:17:07 1. 引言今日继续进程管理与进程间通信IPC。理解进程如何创建、调度以及彼此之间如何传递数据是编写高效 Shell 脚本和系统编程的基础。2. 进程是什么简单说程序是存放在磁盘上的静态文件进程是程序在内存中运行的实例。每个进程拥有独立的地址空间、一组系统资源并且由内核统一调度。每个进程都有一个唯一的PIDProcess ID。PID 为 1 的是 init 或 systemd是所有用户态进程的祖先。用echo $$可以查看当前 Shell 的 PID。2.1 进程的创建fork 与 execl在 Linux 中新进程只能通过fork或 clone从已有进程复制产生再用exec 系列函数装载新程序。fork创建一个与父进程几乎完全相同的子进程返回两次父进程中返回子进程 PID子进程中返回 0。#includeunistd.h#includestdio.hintmain(){pid_tpidfork();if(pid0){printf(I am child, PID %d\n,getpid());}elseif(pid0){printf(I am parent, child PID %d\n,pid);}return0;}fork 之后父子进程并发执行谁先调度由内核决定。写时复制Copy-On-Write技术确保 fork 时只复制页表真正写入时才分配新内存因此 fork 速度很快。exec 系列execl、execv、execle、execve、execlp、execvp用新程序替换当前进程的地址空间不创建新进程。调用成功后原来的代码不再执行失败则返回 -1。#includeunistd.h#includestdio.hintmain(){printf(Before exec...\n);execl(/bin/ls,ls,-l,NULL);// 此行仅 exec 失败时才执行perror(execl failed);return1;}fork exec 组合是 Linux 创建新进程的标准模式先 fork 子进程再在子进程中 exec 新程序父进程可选择 wait 等待子进程结束。3. 进程状态与生命周期Linux 进程在生存期内会在多种状态之间切换常见的包括R运行/可运行—— 正在 CPU 上执行或在运行队列中等待。S可中断睡眠—— 等待某事件如 I/O完成可被信号唤醒。D不可中断睡眠—— 通常在进行硬件 I/O即使收到信号也不能马上返回。T停止—— 被作业控制信号如 CtrlZ暂停。Z僵尸—— 子进程已结束但父进程尚未回收其退出状态。X死亡—— 已回收彻底消失。用ps aux或top可以看到每个进程的状态标识。4. 常用进程管理命令掌握几条基本命令就能在命令行中实时观察和操作进程。# 查看所有进程psaux# 实时监控q 退出top# 按名称结束进程killallfirefox# 按 PID 发送信号-9 为强制终止kill-912345# 让进程在后台运行sleep300# 启动时加 # 或对已暂停的作业执行bg%1# 查看后台作业jobs# 将后台作业调回前台fg%1# 调整优先级-20 最高19 最低nice-n10./my_programrenice5-p12345. 进程间通信概述多个进程协作时必须有一种机制来交换数据或同步行为。Linux 提供了丰富的 IPC 方式从简单的管道到复杂的网络套接字。6. 管道——最常用的 IPC6.1 匿名管道用|连接两个命令前者的标准输出直接成为后者的标准输入中间不产生临时文件。ls-l|greptxt|wc-l管道是半双工的数据只能单向流动。管道的生命周期由两端的进程决定读端进程退出后写端会收到 SIGPIPE。6.2 命名管道FIFO匿名管道只能用于父子进程或兄弟进程之间命名管道有实际的路径名任意两个进程只要知道路径就可以通信。# 创建命名管道mkfifomypipe# 终端 1写入echoHellomypipe# 终端 2读取catmypipe7. 消息队列消息队列由内核维护允许进程以“消息块”为单位异步交换数据。每条消息有类型标识接收方可以选择特定类型。常用命令# 查看系统中的消息队列ipcs-q# 删除指定队列需有权限ipcrm-qmsqid在 C 语言中通过msgget,msgsnd,msgrcv调用。8. 共享内存共享内存是最快的 IPC 方式。两个进程将同一块物理内存映射到各自的地址空间直接读写无需内核中转。# 查看共享内存段ipcs-m# 删除共享内存段ipcrm-mshmid编程时常用shmget,shmat,shmdt。为避免竞争通常搭配信号量使用。9. 信号——异步通知机制信号是在软件层面模拟中断的一种机制用于通知进程发生了某个事件。常见信号信号默认行为说明SIGINT (2)终止前台进程收到 CtrlCSIGTERM (15)终止kill 默认信号可被捕获SIGKILL (9)终止强制杀死不可捕获SIGSTOP (19)停止立即暂停进程SIGCONT (18)继续恢复暂停的进程SIGCHLD (17)忽略子进程终止时发给父进程在 Shell 中可以用trap命令捕获信号#!/bin/bashcleanup(){echo清理临时文件...}trapcleanup SIGINT SIGTERMwhiletrue;dosleep1echo运行中...done10. 套接字——跨网络 IPC套接字不仅用于网络通信也可用于本地进程间通信Unix Domain Socket。相比 IP 套接字Unix 域套接字不需要协议栈封装效率更高。常见场景/var/run 下的 .sock 文件如 Docker 守护进程、MySQL 通过 sock 文件提供服务。11. 总结进程是程序在内存中的运行实体通过 PID 唯一标识。ps、top、kill、jobs是日常管理进程的必备命令。管道适合简单的数据串联命名管道解除亲缘限制。消息队列提供带类型的异步通信。共享内存速度最快但需要配套同步机制。信号用于异步事件通知trap可在脚本中优雅处理。套接字将 IPC 延伸至网络是分布式系统的基础。