进程(父子进程、进程组)、作业、shell、会话、进程终止的几种方式

发布时间 2023-12-27 10:17:12作者: 廿陆

父子进程: 

父进程调用fork()函数创建的新进程(子进程),返回两个值,父进程返回子进程id,子进程返回0;

子进程可以通过 调用  getpid()  来获取自己的pid;也可也调用  getppid()  获取父进程id;

父子进程共享代码空间数据空间独立数据内容是父进程的完整拷贝指令指针也完全相同

子进程从父进程继承的有:

  ? 进程的资格(真实(readl))/有效(effective)/已保存(saved)用户号(UIDs)/组号(GIDs)

  ? 环境  ? 堆栈  ? 内存  ? 进程组号  ? 其他...   

独立拥有:

  ? 进程号  ? 不同的父进程号  ? 自己的文件描述符和目录流拷贝(目录流由 opendir函数创建,因其顺序读取,称为 目录流)  ? 其他...

fork()函数:P1父进程、P2子进程

正文段(code segment/text segment,  .text段):代码段;存放程序执行代码    的一块内存区域。

数据段(data segment,  .data段):存放数据中  已初始化的全局变量(属于静态内存分配)

BSS段(bss segment,  .bss段):存放数据中  未初始化的全局变量(属于静态 内存分配)

堆(heap):动态分配的数据段,大小不固定,调用malloc、new函数调用,利用 free delete释放内存

栈(stack):用户存放程序  临时创建的局部变量,函数大括号  {}(不包括static声明的变量)。

            

进程组:

  进程组就是多个进程的集合,其中有一个组长,组长进程PID等于进程组的PGID。只要在某个进程组中一个进程存在,该进程组就存在,与其组长进程是否终止无关

作业:

  shell就是一个命令解释器,遵循一定的语法将输入的命令加以解释并传给系统。

  shell作为命令语言,可以互动式的解释和执行用户输入的命令;

  shell作为程序设计语言(shell脚本),定义了各种变量和参数,提供了控制结构(循环和分支),调用了系统内核的大部分功能来执行程序、创建文档,协调各程序运行。

  shell分前后台来控制的不是进程而是作业(job)或者进程组(Process Group)

  一个前台作业可以由多个进程组成,一个后台作业也可也由多个进程组成,shell可以运行一个前台作业和任意多个后台作业,称为作业控制。

会话:

  会话(session)是一个或多个进程组的集合。一个会话可以有一个控制终端。再 xshell  或者  WinSCP中打开一个窗口就是新建一个会话。

进程终止的几种方式:

  ? Main函数的自然返回  return

  ? 调用 exit  函数 属于c的函数库

  ? 调用 _exit  函数 属于系统调用

  ?调用 abort  函数 异常程序终止,同时发送  SIGBRT 信号给调用进程

  ? 接收能导致进程终止信号:Ctrl + C(^C)  SIGINT(SIGINT中断进程)