进程的异常终止、子进程的回收、管道

一、进程的异常终止:

    1、进程调用了abort函数,产生 SIGABRT(6) 信号

    2、进程接收到某些信息,可以是其它进程发送的,也可能自己的错误导致的

    3、进程的最后一个线程接收到 "取消" 请求操作,并响应

   

    这三种方式结束进程,它的父进程都无法获取结束状态码,因此叫做异常终止

    注意:无论进程是如何结束的,它们最后都会执行同一段代码,会关闭所有打开的文件,并释放所有的内存

二、子进程的回收

    对于子进程的结束而言,都希望父进程能够知道并作出一定的反应,通过 wait、waitpid 函数可以知道子进程是如何结束的以及它的结束状态码

    pid_t wait(int *status);

    功能:等待子进程结束,并获取结束状态码

    status:输出型参数,接收结束状态码

    返回值:结束的子进程的ID

        1、如果所有子进程都还在运行,则阻塞

        2、如果有一个子进程结束,立即返回该进程的结束状态码和ID

        3、如果没有子进程返回-1

    WIFEXITED(status)

        判断进程是否是正常结束,如果是返回真

    WEXITSTATUS(status)

        如果进程是正常结束的,可以获取到正确的结束状态码

    WIFSIGNALED(status)

        判断进程是否异常结束,如果是返回真

    WTERMSIG(status)

        如果进程是异常结束的,可以获取到杀死进程的信号

   

    pid_t waitpid(pid_t pid, int *status, int options);

    功能:等待回收指定的某个或某些进程

    pid:

        >0  等待该进程结束

        0   等待同组的任意进程结束

        -1  等待任意进程结束,功能与wait等价

        <-1 等待abs(pid) 进程组中的任意进程结束

    status:输出型参数,接收结束状态码

    options:

        WNOHANG 非阻塞模式,如果当前没有子进程结束,则立即返回0

        WUNTRACED 如果有子进程处于暂停态,返回该进程的状态

        WCONTINUED  如果有子进程从暂停态转为继续运行,返回该子进程的状态

    WIFSTOPPED(status)

        判断子进程是否转为暂停态,是返回真

    WSTOPSIG(status)

        获取导致子进程进入暂停态的信号

    WIFCONTINUED(status)

        判断子进程是否由暂停转为继续,是返回真

    int system(const char *command);

    功能:通过创建子进程去执行一个可执行文件

    返回值:子进程结束后才返回

    注意:该函数底层调用了fork、vfork、exec、waitpid函数

    练习1:综合进程管理知识点,实现一个system函数


 

进程间通信

一、基本概念

    什么是进程间通信:是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了进程间协同工作就必须实现进程间交互数据

    进程间通信的分类:

        简单的进程间通信:信号、普通文件、环境变量表、命令行参数

        传统的进程间通信:管道文件

        XSI的进程间通信: 共享内存、消息队列、信号量

        网络进程间通信:Socket套接字

二、传统的进程间通信-管道文件

    管道是UNIX系统中最古老的进程间通信技术,古老意味着所有系统都支持,早期的管道是半双工通信,现有的系统管道是全双工通信

    管道就是一种特殊的文件,数据在文件中是流动的,读取之后就自动消失,如果文件中没有数据则会阻塞

    有名管道:基于有文件名的管道文件的通信

        编程模型

            进程A               进程B

          创建管道            

          打开管道              打开管道

          写数据                读数据

          关闭管道              关闭管道

          删除管道

       

        创建有名管道文件:

        1、命令 mkfifo

        2、函数

        int mkfifo(const char *pathname,mode_t mode);

        功能:创建有名管道

        pathname:管道文件路径

        mode:管道文件权限 0664

    匿名管道:

        只适合通过fork创建父子进程之间使用

        int pipe(int pipefd[2]);

        功能:创建一个匿名管道文件

        通过pipefd返回该匿名管道文件的读权限fd和写权限的fd

        pipefd[0]   用于读匿名管道

        pipefd[1]   用于写匿名管道

        编程模型:

            父进程              子进程

            获取一对fd

            创建子进程          拷贝\共享一对fd

            关闭读              关闭写

            写数据              读数据

            关闭写              关闭读

三、XSI进程间通信

    X/open公司制定的用于进程间通信的系统(S)接口(I)

    XSI进程间通信都需要借助系统内核完成,需要创建内核对象,内核对象会以整数形式返回给用户态,类似于文件描述符,也叫做IPC标识符

    文件的创建打开需要借助文件名,IPC内核对象需要借助IPC键值(整数),必须要确保IPC键值是独一无二的

       

        key_t ftok(const char *pathname, int proj_id);

        功能:计算出一个独一无二的IPC键值

        pathname:项目路径

        proj_id:项目标号

        返回值:计算出来的IPC键值

        注意:项目路径必须真实存在,否则计算出来的key永远相同

共享内存:

    基础特点:

        两个或多个进程之间共享一块由内核负责统一管理内存,该内存可以与多个进程的虚拟内存进行映射

        int shmget(key_t key,size_t size,int shmflg);

        功能:创建\获取一块共享内存

        key:IPC键值

        size:共享内存的大小,获取共享内存时此参数无意义,一般给0

        shmflg:

            IPC_CREAT   创建共享内存,如已存在直接获取

            IPC_EXCL    共享内存已存在,返回失败

            获取时直接给0

            注意:如果是创建共享内存还需要额外提供共享内存的权限  例如:IPC_CREAT|0664

        返回值:IPC标识符,失败-1

        void *shmat(int shmid,const void *shmaddr, int shmflg);

        功能:让虚拟内存与共享内存进行映射

        shmid:IPC标识符 shmget的返回值

        shmaddr:想要映射的虚拟内存首地址,为NULL时系统会自动分配地址

        shmflg:

            SHM_RDONLY 以只读方式映射共享内存

            SHM_RND:只有shmaddr参数不为NULL时才有有效,表示从shmaddr开始向下以整数页方式映射

       

        返回值:与共享内存映射成功后的虚拟内存首地址,失败返回(void *) -1

        int shmdt(const void *shmaddr);

        功能:取消映射

        shmaddr:映射成功后的虚拟内存首地址

        int shmctl(int shmid,int cmd,struct shmid_ds *buf);

        功能:删除/控制共享内存

        shmid:IPC标识符

        cmd:

            IPC_STAT   获取共享内存属性 buf输出型参数

            IPC_SET    设置共享内存属性 buf输入型参数

            IPC_RMID   删除共享内存     NULL

        buf

    编程模型:

        进程A               进程B

        创建共享内存        获取共享内存

        映射共享内存        映射共享内存

        写数据并通知其他进程 收到通知并读数据

        收到通知并读数据    写数据并通知其他进程

        取消映射            取消映射

        删除共享内存        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值