十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

从零开始的敲代码生活--Linux应用软件(进程)

从零开始的敲代码生活--Linux应用软件(进程) 一、什么是进程进程正在执行的程序需要消耗内存和CPU资源。进程与程序的区别程序是存放在硬盘上的静态指令集合进程驻留内存运行需要CPU参与内存CPU进程拥有完整动态生命周期从启动直到消亡运行一个程序可以产生一个或者多个进程一个进程内部也可以执行多个不同程序。二、进程的创建执行./a.out就会启动一个进程。 进程被创建时操作系统分配 0‑4G虚拟地址空间。进程是操作系统资源分配的最小单位。三、进程的调度CPU调度宏观并行微观串行实现并发并行多个任务同一时刻同时执行并发宏观看上去同时跑微观交替执行常见CPU调度算法时间片轮询算法先来先服务算法高优先级优先执行算法短作业优先算法四、进程的状态基础三态模型就绪态 → 运行态 → 等待态Linux进程状态标识状态标识状态名称说明R运行/就绪态正在被CPU执行或者就绪等待CPU时间片S可唤醒等待态睡眠阻塞等待资源可以被信号唤醒D不可唤醒等待态不可被信号打断的睡眠一般IO阻塞T暂停态进程被暂停执行Z僵尸态进程已经结束但资源未被父进程回收X结束态进程结束资源已经回收五、进程的消亡两个环节进程退出进程资源回收六、进程相关命令ps -aux查看全部进程PID、创建者、状态、CPU、内存占用。ps -aux | grep a.out|管道把前一条命令输出作为后一条输入grep用于字符串过滤查找。ps -ef查看PID、PPID父进程IDPID进程IDPPID父进程ID父进程创建子进程的进程子进程被创建出来的新进程top动态实时刷新查看进程、CPU、内存占用。pstree查看进程族谱父子关系。pstree -sp 进程IDkill发送信号kill -信号ID PID kill -l # 查看系统全部信号 kill -9 PID # 强制杀死进程jobs/fgjobs查看当前终端后台进程列表fg 后台编号将后台进程调到前台运行七、进程相关函数1. fork 创建子进程fork原理拷贝父进程0‑3G用户空间给子进程PCB内核部分拷贝PID、PPID、程序执行位置、文件管理不拷贝。 父子进程共享3G‑4G内核空间0‑3G用户空间相互独立不能直接通信进程间通信需要IPC机制。#include unistd.h pid_t fork(void);返回值成功父进程返回子进程PID子进程返回 0失败返回-1不创建新进程2. getpid / getppidpid_t getpid(void); // 获取自己的PID pid_t getppid(void); // 获取父进程PID3. 进程退出方式程序执行完毕自然退出main函数returnexit()/_Exit()接收信号退出kill‑9#include stdlib.h void exit(int status); // status0正常退出非0异常退出 void _exit(int status); void _Exit(int status);4. 僵尸进程 孤儿进程僵尸进程(Z)子进程已经结束父进程尚未回收子进程资源。 避免方案父进程调用wait/waitpid回收子进程让子进程成为孤儿进程交给系统进程回收孤儿进程父进程先退出子进程被系统init进程收养结束由系统自动回收守护进程常用该机制。5. wait 阻塞回收子进程#include sys/types.h #include sys/wait.h pid_t wait(int *wstatus);参数wstatus接收子进程退出状态不关心状态填NULL。返回成功返回被回收子进程PID失败返回‑1。特点阻塞等待有僵尸子进程才返回。使用示例wait(NULL);6. waitpid 回收指定子进程比wait更加灵活支持非阻塞。pid_t waitpid(pid_t pid, int *status, int options);pid参数-1回收该进程组任意子进程-1回收任意子进程等价wait0回收同进程组的子进程0回收PID等于该值的指定子进程options选项0阻塞模式WNOHANG非阻塞没有子进程可回收直接返回0返回成功子进程pid无待回收子进程WNOHANG返回0出错返回‑1业务场景父进程还要做别的任务使用WNOHANG轮询回收。八、exec函数簇作用在现有进程内部执行外部可执行程序替换进程代码段PID不变。函数说明execl()传入完整路径参数列表形式传参execlp()从PATH环境变量搜索程序列表传参execv()完整路径argv数组传参execvp()PATH搜索程序argv数组传参execle()带自定义环境变量列表传参execvpe()带自定义环境变量数组传参字母含义llist参数列表逐个写vvector参数存入char*数组pPATH从环境变量路径查找程序e传入自定义环境变量int execl(const char *path, const char *arg, ... /* (char *) NULL */); int execlp(const char *file, const char *arg, ... /* (char *) NULL */); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */); int execvpe(const char *file, char *const argv[], char *const envp[]);exec系列只有出错才有返回值返回‑1执行成功不会返回。
返回列表