系统编程之进程

    技术2022-07-10  127

    一、进程相关概述 1、相关指令 ps -aux 查看所有进程 ps -aux|grep 进程 只会过滤出指定进程信息 top 指令类似Windows任务管理器 2、进程描述符 pid pid = 0 称为交换进程 --进程调度 pid =1 init进程 --系统初始化 二、c程序的存储空间是如何分配的 从高地址到低地址 按如下顺序 命令行参数和环境变量:int main(int argc,char**argv) 栈空间:自定义的函数和其中局部变量 堆空间: malloc和calloc 未初始化的数据:bss段 int a[128]; 初始化的数据 :数据段 int a =10; 正文 :代码段 三、fork函数的使用 getpid() 获得当前进程的pid getppid()获得父进程的pid

    #include <stdio.h> #include <unistd.h> int main() { pid_t pid1; printf("father pid is %d\n",getpid());//与父进程的pid一样,只有父进程跑 pid1 = fork(); if(pid1 == -1) { perror("fork error"); } printf("pid is %d\n",getpid());//父子进程都会跑 if(pid1==0)//子进程 { printf("this child fork pid is %d\n",getpid()); } if(pid1>0)//父进程 { printf("this father fork pid is %d\n",getpid()); } return 0; }

    四、vfork函数的使用 与fork函数的区别 1、直接使用父进程的存储空间,不拷贝 2、vfork保证子进程先运行,子进程调用exit后,父进程才运行 验证demo

    #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int cnt = 0; int main() { pid_t pid; pid = vfork(); if(pid==0) { while(1) { printf("this is child fork\n"); sleep(1);//防止刷屏 cnt++; if(cnt == 3) { exit(0); } } } else if(pid > 0) { while(1) { printf("this is father cnt is %d\n",cnt); sleep(1); } } return 0; }

    五、wait函数 作用:用于等待子进程的退出,回收子进程退出时的状态,子进程状态不被回收就会变成僵尸(zombie)进程(僵死进程) 检查wait 所返回的终止状态的宏: WIFEXITED(status) 正常终止子进程产生的状态 对于这种情况可使用WEXTSTATUS(status) WIFSIGNALED(status) 异常终止子进程返回的状态 对于这种情况可使用WTERMSIG(status) WIFSTOPPEDED(status) 当前暂停子进程返回的状态 对于这种情况可使用WSTOPSIG(status) WIFCONTINUED(status)

    demo验证

    #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int cnt = 0; int main() { pid_t pid; int status; pid = fork(); if(pid==0) { while(1) { printf("this is child fork\n"); sleep(1);//防止刷屏 cnt++; if(cnt == 3) { exit(3); } } } else if(pid > 0) { while(1) { //原型:pid_t wait(int *status) //wait(NULL);//表示不关心子进程退出的状态 wait(&status); printf("status is %d\n",WEXTSTATUS(status));//打印的值为3 printf("this is father cnt is %d\n",cnt); sleep(1); } } return 0; }

    waitpid 与 wait 的区别 pid_t waitpid(pid_t pid, int *status, int options); options 参数会影响 父进程是否阻塞来等待子进程## 标题 六、孤儿进程 父进程如果不等待子进程的退出,在子进程之前就结束了自己的生命,此时子进程就叫做孤儿进程 linux 避免存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程

    Processed: 0.010, SQL: 9