ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux应用软件编程 进程

Linux应用软件编程 进程 L1. 进程与程序程序存放在硬盘上的静态指令集合.out、可执行文件。进程正在运行的程序占用内存、CPU 资源具备完整生命周期。区别程序静态存硬盘进程动态运行在内存需要 CPU 调度。一个程序可以产生多个进程一个进程内部也可以执行多个程序。进程是操作系统资源分配的最小单位。进程被创建时操作系统分配 0‑4G 虚拟内存空间。 虚拟内存分区栈区、堆区、.data 段 (已初始化全局 / 静态变量)、.bss 段 (未初始化全局 / 静态变量)、字符串常量区、文本区 (代码)。2. 进程的 7 种状态状态标识说明运行态RCPU 正在执行该进程用户态 / 内核态就绪态R一切资源就绪只等待 CPU 时间片可中断睡眠阻塞S等待资源可以被信号唤醒fgets、getchar不可中断睡眠D等待硬件不能被信号打断暂停态T收到暂停信号被挂起僵尸态Z进程已经退出退出状态未被父进程回收残留 PCB结束态X进程资源全部回收三态模型简化就绪态 → 运行态 → 阻塞态就绪→运行CPU 调度分配时间片运行→就绪时间片耗尽运行→阻塞请求 IO 资源等待输入、sleep阻塞→就绪获得等待的 IO 资源3. 进程常用命令ps -aux查看所有进程显示 PID、CPU、内存、进程状态ps -ef查看 PID、PPID (父进程 ID)top动态实时查看进程 CPU、内存占用pstree树形查看父子进程关系kill -9 PID发送 9 号信号强制杀死进程kill -l查看全部信号jobs查看后台任务fg 编号把后台进程调到前台运行PID进程 IDPPID父进程 ID谁创建我谁就是我的父进程。4. 创建进程 fork ()#include sys/types.h #include unistd.h pid_t fork(void);功能创建子进程。返回值父进程返回子进程 PID大于 0子进程返回0创建失败返回-1fork 后子进程拷贝父进程用户空间栈、堆、data、bss、代码段内核空间 PCB 是新建的。用户空间父子进程完全独立全局变量互不干扰。文件描述符会被复制父子共享同一个打开的文件。fork 返回处父子进程同时开始往下执行代码。辅助函数getpid()获取自己进程 PIDgetppid()获取父进程 PID5. 进程退出函数#include stdlib.h void exit(int status); // 库函数会刷新缓冲区再退出 void _exit(int status); // 系统调用直接退出不刷新缓冲区status退出状态0 代表正常退出非 0 异常退出。进程退出的 4 种方式main函数return调用exit()/_exit()代码执行完毕自然结束收到 kill 信号被终止。6. 僵尸进程 孤儿进程僵尸进程 (Z)子进程先退出父进程没有调用接口回收子进程资源子进程 PCB 残留在内核变成僵尸进程。 危害占用内核 PCB 资源大量僵尸会耗尽系统进程号。处理方案父进程调用wait()/waitpid()回收子进程让子进程成为孤儿由 init/systemd 进程收养自动回收。孤儿进程父进程先退出子进程还在运行子进程失去亲生父进程被系统 init 进程收养。 孤儿进程结束后会被 init 自动回收不会变成僵尸守护进程大多是孤儿进程。7. 进程资源回收 wait /waitpidwaitpid_t wait(int *wstatus);阻塞等待回收任意一个僵尸子进程参数wstatus保存子进程退出状态不关心状态填NULL返回值成功返回被回收子进程 PID失败返回‑1。waitpid更灵活推荐pid_t waitpid(pid_t pid, int *status, int options);pid0回收指定 PID 的子进程-1回收任意子进程等价 waitstatus保存退出状态不需要填NULLoptions0阻塞等待WNOHANG非阻塞没有僵尸子进程立刻返回 0不会卡住程序。使用 WNOHANG 可以让父进程一边做自己业务一边轮询回收子进程不会被阻塞。8. exec 函数簇fork 出子进程之后子进程想跑别的程序使用 exec 族函数替换当前进程的代码段PID 不变。常用// l列表传参p自动搜索PATH环境变量路径 int execl(const char *path, const char *arg, ... , (char *)NULL); int execlp(const char *file, const char *arg, ... , (char *)NULL);示例execl(/bin/ls,ls,-l,NULL); execlp(ls,ls,-l,NULL);exec 执行成功后面代码不会运行只有失败才返回‑1 继续执行。参数后缀记忆llist参数以列表形式传入以NULL结尾vvector参数存到 char * 数组传入ppath会去 PATH 环境变量寻找可执行文件不用写完整路径eenv可以自定义环境变量。9. 进程间通信小结进程用户空间互相独立不能直接访问对方变量必须依靠内核提供 IPC 通信方式管道、命名管道、消息队列、共享内存、信号量、socket。对比线程同一进程下多个线程共享全局变量、堆线程通信简单进程之间必须 IPC。
返回列表