服装工厂做网站的好处,网站开发的抓包,网站改版思路,广告公司取名大全进程相关知识点1. 进程的含义进程是一个正在执行的程序实例#xff0c;是操作系统进行资源分配和调度的基本单位。关键点#xff1a;PCB#xff08;Process Control Block#xff09;#xff1a;进程控制块#xff0c;Linux中实现为task_struct结构体包含信息#xff1a…进程相关知识点1. 进程的含义进程是一个正在执行的程序实例是操作系统进行资源分配和调度的基本单位。关键点PCBProcess Control Block进程控制块Linux中实现为task_struct结构体包含信息PID进程标识符当前工作路径可通过chdir改变umask文件创建掩码默认0002进程打开的文件列表信号处理设置用户ID、组ID进程资源上限ulimit -a查看2. 进程与程序的区别程序进程静态的代码和数据集合动态的执行过程存储在硬盘中存在于内存中永久存在暂时存在无状态变化有状态变化创建、运行、终止无并发性可以并发执行-竞争计算机资源关系一个程序可运行多次→多个进程一个进程可运行一个或多个程序3. 进程的内存分布0-3GB用户空间进程私有 3-4GB内核空间所有进程共享使用虚拟地址空间通过MMU映射到物理内存1页 4KB4. 进程状态基本三态就绪态→运行态→阻塞态Linux扩展状态R运行态运行或就绪S可中断睡眠态等待事件D不可中断睡眠态等待I/OT停止态暂停Z僵尸态进程终止但资源未回收X结束态5. 进程调度与上下文切换内核核心功能进程调度调度算法RR时间片轮转、FIFO等宏观并行多个进程同时运行微观串行单个CPU同一时间只执行一个进程上下文切换保存当前进程状态恢复另一进程状态6. 进程相关命令# 1. 查看进程信息 ps aux ps -ef # 2. 动态查看进程 top htop # 3. 终止进程 kill -信号 PID killall -信号 进程名 # 常用信号 kill -2 PID # SIGINT中断同CtrlC kill -15 PID # SIGTERM终止默认 kill -9 PID # SIGKILL强制终止7. 进程创建fork#include unistd.h pid_t fork(void);特点一次调用两次返回父进程返回子进程PID0子进程返回0失败返回-1子进程继承父进程的0-3G用户空间副本父进程的PCB副本PID不同文件描述符表从fork()后开始执行示例// 一次fork生成2个进程父子关系 fork(); // 两次fork生成4个进程 fork(); // 生成父子2个进程 fork(); // 每个进程再fork共4个 // 关系父子、兄弟关系8. 获取进程信息pid_t getpid(void); // 获取当前进程PID pid_t getppid(void); // 获取父进程PID9. 进程终止方式正常终止main()中returnexit()C库函数刷新缓冲区执行清理函数_exit()/_Exit()系统调用不刷新缓冲区最后一个线程从main返回最后一个线程调用pthread_exit()异常终止abort()产生SIGABRT信号收到终止信号如kill最后一个线程被取消10. exit函数与状态回收#include stdlib.h void exit(int status); // 库函数 void _exit(int status); // 系统调用 // 注册退出处理函数 int atexit(void (*function)(void));11. 僵尸进程与孤儿进程僵尸进程子进程终止父进程未回收wait孤儿进程父进程终止子进程被init进程收养12. 进程资源回收#include sys/wait.h // 阻塞等待任意子进程 pid_t wait(int *status); // 更灵活的等待 pid_t waitpid(pid_t pid, int *status, int options);status处理宏WIFEXITED(status) // 是否正常退出 WEXITSTATUS(status) // 获取退出状态 WIFSIGNALED(status) // 是否因信号终止 WTERMSIG(status) // 获取终止信号waitpid参数pid -1等待任意子进程同waitpid 0等待指定PID子进程pid 0等待同进程组的子进程pid -1等待指定进程组的子进程options 0阻塞options WNOHANG非阻塞13. exec函数族功能用新程序替换当前进程映像六种变体int execl(const char *path, const char *arg, ..., NULL); int execv(const char *path, char *const argv[]); int execle(const char *path, const char *arg, ..., char *const envp[]); int execve(const char *path, char *const argv[], char *const envp[]); int execlp(const char *file, const char *arg, ..., NULL); int execvp(const char *file, char *const argv[]);区别带l参数列表形式list带v参数数组形式vector带p使用PATH环境变量查找可执行文件带e可传递环境变量数组示例// 方式1参数列表 execl(/bin/ls, ls, -l, NULL); // 方式2参数数组 char *args[] {ls, -l, NULL}; execv(/bin/ls, args); // 方式3使用PATH查找 execlp(ls, ls, -l, NULL);14. system函数#include stdlib.h int system(const char *command);内部实现fork() exec() wait()15. 编程练习示例练习1父子进程同时写文件#include stdio.h #include unistd.h #include time.h #include sys/wait.h int main() { pid_t pid fork(); if (pid 0) { // 父进程 FILE *fp fopen(1.txt, a); for (int i 0; i 5; i) { time_t now time(NULL); fprintf(fp, 父进程 PID%d 时间:%s, getpid(), ctime(now)); fflush(fp); sleep(1); } fclose(fp); wait(NULL); // 等待子进程 } else if (pid 0) { // 子进程 FILE *fp fopen(1.txt, a); for (int i 0; i 5; i) { time_t now time(NULL); fprintf(fp, 子进程 PID%d 时间:%s, getpid(), ctime(now)); fflush(fp); sleep(1); } fclose(fp); } return 0; }练习2waitpid指定回收进程#include stdio.h #include unistd.h #include stdlib.h #include sys/wait.h int main() { pid_t pids[3]; for (int i 0; i 3; i) { pids[i] fork(); if (pids[i] 0) { sleep(rand() % 3); // 子进程睡眠随机时间 printf(子进程 %d 退出\n, getpid()); exit(i); // 退出状态为i } } // 父进程指定回收第二个子进程 int status; pid_t ret waitpid(pids[1], status, 0); if (ret 0 WIFEXITED(status)) { printf(回收进程 %d退出状态: %d\n, ret, WEXITSTATUS(status)); } // 非阻塞回收其他进程 while (1) { pid_t ret waitpid(-1, status, WNOHANG); if (ret 0) { printf(非阻塞回收进程 %d\n, ret); } else if (ret 0) { // 还有子进程运行 sleep(1); } else { // 所有子进程已回收 break; } } return 0; }作业父子进程文件通信#include stdio.h #include unistd.h #include string.h #include sys/wait.h int main() { pid_t pid fork(); if (pid 0) { // 父进程写数据 FILE *fp fopen(data.txt, w); char buf[256]; while (1) { printf(输入内容(quit退出): ); fgets(buf, sizeof(buf), stdin); buf[strlen(buf)-1] \0; // 去掉换行符 fprintf(fp, %s\n, buf); fflush(fp); if (strcmp(buf, quit) 0) break; } fclose(fp); wait(NULL); // 等待子进程 } else if (pid 0) { // 子进程读数据 sleep(1); // 等待父进程先写 FILE *fp fopen(data.txt, r); char buf[256]; while (1) { if (fgets(buf, sizeof(buf), fp) ! NULL) { buf[strlen(buf)-1] \0; printf(子进程读取: %s\n, buf); if (strcmp(buf, quit) 0) break; } usleep(100000); // 100ms } fclose(fp); } return 0; }16.重要概念总结并发vs并行并发多个进程交替执行单核并行多个进程同时执行多核进程分类交互式进程shell、编辑器批处理进程shell脚本守护进程后台服务原语操作fork、exec、wait等是不可分割的原子操作进程关系父子进程、兄弟进程进程组、会话资源管理避免僵尸进程及时wait避免孤儿进程合理设计进程关系文件描述符继承与关闭