进程(父子进程、进程组)、作业、shell、会话、进程终止的几种方式
父子进程:
父进程调用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中断进程)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)