进程控制1

进程创建

  1. pid_t fork(); //pid_t 就是一个整形
    通过复制父进程创建子进程,子进程独立于父进程,fork的父子进程运行顺序不定,取决于内核的调度算法
    进程调用fork,当控制转移到内核中的fork代码后,内核做:
    1)分配新的内存块和内核数据结构给子进程
    2)将父进程部分数据结构内容拷贝至子进程
    3)添加子进程到系统进程列表当中
    4)fork返回,开始调度器调度

  2. 父子进程数据独有,代码共享(因为代码是只读的,不能改变)

  3. 写时拷贝技术
    子进程创建出来后,各个虚拟地址在物理内存中的指向与父进程完全相同,这是为了提高子进程的创建效率,否则就要为子进程开辟物理内存,拷贝数据过来,更新页表,整个过程比较慢,而且有可能子进程用不到这些数据;通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本

  4. 返回值
    对于父进程,返回的是子进程的pid;
    对于子进程,返回的是0;
    我们可以通过返回值对父子进程进行代码分流,让其各自执行不同的代码段

  5. pid_t vfork()
    父子进程共用虚拟地址空间,用vfork创建子进程后,父进程会被阻塞,直到子进程调用exec(进程替换)或exit(进程退出),vfork保证子进程先运行,避免调用栈混乱

进程终止

  1. 进程退出的场景
    1)正常退出:代码运行完毕,结果正确;代码运行完毕,结果不正确
    2)异常退出:代码异常终止
  2. 进程退出方式
    1)在main函数中return,退出进程的时候会刷新缓冲区
    2)void_exit(int status); //status退出返回值
    系统调用接口;退出调用进程,谁调用谁退出;在任意位置调用exit都会退出进程
    退出进程时不会刷新缓冲区,直接释放资源
    3)void exit(int status); //需要添加头文件#include<stdlib.h>
    库函数;退出调用进程,谁调用谁退出; 在任意位置调用exit都会退出进程
    退出进程时会刷新缓冲区

进程等待

  1. 作用:避免僵尸进程的产生
  2. 接口介绍
    1)pid_t wait(int *status); //添加头文件:#include<sys/wait.h>
    返回值:
    成功返回被等待进程pid,失败返回-1
    阻塞等待任意一个子进程的退出,通过status获取子进程的退出返回值,返回退出子进程的pid;wait不仅仅是处理刚退出的子进程,只要在调用wait的时候有子进程退出,wait都会去获取返回值,释放资源
    阻塞:为了完成一个功能发起一个调用,若当前不具备完成功能的条件,则一直等待
    2)pid_t waitpid(pid_t pid,int status,int options);
    返回值:
    当正常返回时,waitpid返回收集到的子进程的进程id;如果设置了选项WNOHANG,而调用中发现没有已退出的子进程可收集,则返回0;如果调用出错,则返回-1,这时errno会被设置成相应的值以指示错误所在
    参数:
    pid:值为-1,表示等待任意一个子进程退出;值为0表示等待指定的子进程退出
    status:用于获取子进程的退出返回值
    options:值为0表示阻塞等待子进程退出 waitpid(-1,&status,0)==wait(&status);值为WNOHANG–将waitpid设置为非阻塞
    非阻塞:为了完成一个功能,发起调用,若当前不具备完成功能的条件,则立即报错返回
    3)非阻塞/阻塞优缺点:
    非阻塞不用一直等着,可以在不满足条件期内,干别的事,对资源利用效率更高,但是通常需要循环操作

获取子进程status

返回值的获取:进程的返回值使用一个字节空间进行保存,在status中,只使用了低16位空间获取返回值
低16位中高8位是子进程返回值:(status>>8)&0xff;低7位中保存进程的异常退出信号值:status&0x7f

  1. WIFEXITED(status)
    判断进程是否正常退出(调用exit/_exit/main函数中的return退出)

  2. WEXITSTATUS(status)
    获取子进程退出返回值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值