进程控制

来源:互联网 发布:怎么成为大数据分析师 编辑:程序博客网 时间:2024/06/06 00:59
本编博客主要介绍进程的一些基本概念
感谢观看,欢迎提出问题
联系方式:blbagony@163.com

进程

1. 进程标志
  • 每一个进程都有一个非负整数用来表示唯一的进程,这个整数就是进程 ID 可以用 ps 命令和 top 命令来查看。

  • 除了进程 ID 还有一些其他标识符。下列函数返回这些标识符

    这里写图片描述

2. 函数 fork
  • 已给现有的进程可以调用 fork 函数创建一个新进程。
    这里写图片描述
  • frok 函数被调用一次返回两次,区别是,当返回值为 0 时,表示子进程,当返回值 > 0 表示父进程,其返回值即子进程的进程 ID。错误返回 -1,并设置 errno。

  • 为什么给父进程返回子进程 ID:
    因为一个进程的子进程可以有多个,并且没有一个函数可以返回一个进程所有子进程 ID。

  • 为什么给子进程返回 0
    因为对每个进程而言只有一个父进程,可以调用 getppid 函数获取其父进程 ID。

  • 在父进程执行 fork 函数之后,子进程和父进程继续执行 fork 之后的命令。此时子进程是父进程的副本,子进程获得父进程的数据空间、堆和栈的副本。需要注意的是:这是子进程所拥有的副本。父进程和子进程并不共享这些存储空间。父进程和子进程共享正文段(用来放代码)。
    这里写图片描述

  • 由于 fork 之后经常伴随着 exec,所以现在很多实现并不执行一个父进程数据段、栈和堆的完全副本。作为替代,使用了写时拷贝技术,当父进程或子进程试图修改这些区域时,系统会为该区域制作一个副本,通常是虚拟存储系统中的“一页”。

文件共享

  • 在重定向父进程的标准输出时,子进程的标准输出也被重定向,fork 的一个特性是父进程打开的所有文件描述符都被复制到子进程之中。

重要的一点,父进程和子进程共享同一个文件偏移量。

父进程和子进程之间的区别

fork 的返回值不同
进程 ID 不同
两个进程的父进程不同
子进程的 tms_utime、tms_stime、tms_cutime 和 tms_ustime 的值设置为 0
子进程不继承父进程设置的文件锁
子进程未处理的文件闹钟被清除
子进程未处理的信号集置为空

fork 失败的两个主要原因

系统已经有太多的进程
该实际用户 ID 的进程总数超过了系统限制。


进程终止:
  • 进程终止有八种方式,其中五中未正常终止:

    (1) 从 main() 函数中返回;
    (2) 调用 eixt;
    (3) 调用 _eixt 或 _EXIT;
    (4) 最后一个线程从启动例程中返回;
    (5) 从最后一个线程中调用 pthread_exit;

  • 异常终止的三种方式

    (6) 调用 abort;
    (7) 接收到一个信号;
    (8) 最后一个线程对取消做出相应。


  1. 退出函数
    三个函数用于正常终止一个程序:_exit 和 _EXIT 立即进入内核,exit 则先进行一些清理处理,然后返回内核。
#include <stdlib.h>void exit(int status)void _EXIT(int status)#include <unistd.h>void _exit(int status)三个函数都有一个整型参数,称之为终止状态或是退出码。unix 大多数 shell 都提供检查进程终止状态的方法,一般是 $? 。在 main 函数中调用 exit(0) 和 调用 return (0) 是一样的。

这里写图片描述


  1. 函数 atexit

一个进程可以登记多至 32 个函数,这些函数将由 exit 自动调用,我们称这些函数为终止处理程序,并调用 atexit 函数来登记这些函数。
这里写图片描述
atexit 参数是一个函数地址,当调用此函数时不用传递任何参数,也不需其起返回值。exit 调用这些函数的顺序与他们登记时候的顺序相反。
这里写图片描述
执行结果:
这里写图片描述