终端与作业控制

2023-05-16

进程组

 

1)简单来说进程组就是多个进程组成的集合

2)和进程一样,进程有唯一的PID进行表识,同样进程组也有一个唯一的标识就是进程组ID,即每个组长的ID(组长ID一般是该组的第一个进程的ID)

3)进程组的生命周期:一个进程组是用组长ID进行标识的,但是不要错误的认为组长进程结果,该进程组就结束;而进程组的生命周期是取决于该组中最后一个退出的进程,只要该组还有一个进程就认为该进程组是存在的。

4)获取进程组ID的方法:getpgid或者getpgrp

#include <unistd.h>

pid_t getpgid(pid_t pid);	//成功返回进程组ID,失败返回-1
pid_t getpgrp(void);

5)一个进程组可以为自己或者子进程设置进程组ID(如果不设置的话,默认为该进程组的第一个进程ID)

#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);	//成功返回0,失败返回-1

代码演示:

父进程创建出一个子进程,然后通过getpgrp或者getpgid来获取当前进程组的组长ID,查看当前进程组的组长ID

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>


int main()
{
        int id=fork();
        if(id==0){
                printf("i am a child, my pid is %d,my parent id is %d\n",getpid(),getppid());
                printf("i am a child, my pid is %d,my group id is %d\n",getpid(),getpgrp());
                printf("i am a child, my group id is %d,my parent id is %d\n",getpgid(getpid()),getppid());
        }
        else if(id>0){
                printf("i am a parent, my pid is %d,my parent id is %d\n",getpid(),getppid());
                printf("i am a parent, my id is %d, my group id is %d\n",getpid(),getpgid(getpid()));
                exit(1);
        }
        return 0;
}
运行结果(默认为该进程组的第一个进程ID)



作业

 

1)作业的本质还是进程的集合,不过在将进程和作业进行对比时这些说法就不那么正确了,因为shell分前后台运行的不是进程而是作业;

2)作业控制:shell可以同时运行一个前台作业和多个后台作业;

3)不管是前台作业还是后台作业,都可以由多个进程组成;

4)在一个作业中新创建一个进程,该进程属于作业不属于进程组。

 

代码演示:

父进程创建一个子进程,然后父进程直接退出,如果作业中的某个进程创建的子进程程属于进程组而不属于作业的话,那么父进程退出的话,子进程应该代替父进程成为新的前台进程运行。


运行结果

当父进程结束后,子进程被1号进程所领养,但子进程不在属于该进程组而是属于作业,同时使用组合键ctrl+c时不能终止该进程,说明其子进程是一个后台进程,要杀掉该作业只能通过kill命令向其发送相应的信号



使用kill命令杀死子进程演示:

为了防止输出队列冲散输入队列的输入效果,重新打开一个终端进行kill命令的执行



会话(SID)

 

1)一个或者多个进程组的集合称为一次会话;

2)可以简单的理解一个会话就是一个终端,而Linux下一切皆文件,所以不同的终端其本质是相当于一个个不同的普通文件;

3)会话控制:一次会话中包括一个前台进程组,任意多个后台进程组和控制进程;

4)控制进程:建立与控制终端连接的会话首进程被称为控制进程。

5)新建一个终端的过程就是新建一个会话


代码实现:

 

运行结果:



查看系统中新建终端会话的数量:ps axj

新建一个会话的过程就是新建一个终端的过程,而新建终端必然会产生一个bash,因此直接过滤出来当前系统下的bash即可


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

终端与作业控制 的相关文章

  • C语言if语句中的零值比较

    目录 xff1a 布尔变量与零值比较 整型变量与零值比较 浮点变量与零值比较 指针变量与零值比较 布尔变量与零值比较 规则 xff1a 不可将布尔值直接与0 1或者true false比较 代码示例 xff1a span style fon
  • vs下的debug和release版本的区别

    vs下的版本分类 xff1a Debug版本 通常称为调试版本 xff0c 通过编译选项的配合 xff0c 编译的结果通常包含调试信息 xff0c 可以设置断点 单步调试 使用TRACE ASSERT等调试输出语句并且编译器不会对代码进行任
  • 二进制文件与文本文件的区别

    文本文件和二进制文件的定义 xff1a 计算机在物理内存上面存放的都是二进制 xff0c 所以文本文件和二进制文件的 主要 区别是在逻辑上 的而不是物理上的 而从文件的编码方式来看 xff0c 文件可以分为文本文件和二进制文件 文本文件是基
  • 浅析FILE和fd之间的关系

    背景知识 fd 文件描述符 FILE 文件指针 文件描述符fd fd只是一个整数 xff0c 在open时产生 起到一个索引的作用 xff0c 进程通过PCB中的文件描述符表找到该fd所指向的文件指针file 因此在Linux系统下面 xf
  • 面向过程与面向对象的区别与联系

    处理问题方面 面向过程 xff1a 分析解决问题所需要的步骤 xff0c 通过分别去实现对应的函数来完成每一个步骤 xff0c 使用的时候一次去调用对应的函数即可 xff1b 面向对象 xff1a 面向对象的是把所处理的问题先抽象起来 xf
  • fork与vfork创建进程的区别

    进程创建的方式 xff1a 1 fork函数 2 vfork函数 fork函数 头文件 xff1a include lt unistd h gt 函数原型 xff1a pid t fork void 返回值 xff1a 创建成功子进程返回0
  • Linux下的各种id

    分类 用户标识符 xff1a 几个典型进程的ID及其类型和功能 常见标识符的返回值 span style font size 18px include lt sys types h gt include lt unistd h gt pid
  • Ubuntu 18.04开启root账户登陆

    step 1 设置root账户密码 命令 xff1a sudo passwd root step2 修改相关配置 打开 root profile文件 xff0c 将最后一行mesg n true修改为tty s amp amp mesg n
  • 深入理解vector的拷贝构造

    腾讯面试题 xff1a 请问vector的拷贝构造干了些什么 xff1f 拿到这道题可能很多人都已经暗自里庆幸 xff0c 对于学习过过数据结构的人 xff0c 对于vector这个结构体一定不会陌生 xff0c 但是如果在面试的过程中面试
  • 深入理解C++强制类型转换

    C 43 43 四种强制转换类型 static cast reinterpret cast const cast dynamic cast static cast 静态转换 xff0c 用于非多态类型 xff0c 任何标准的转换都可以用它
  • Linux背景设置

    桌面背景设置 对于Linux的CentOs系统 刚进入时系统默认的生成的背景如下 显然对于一些比较有艺术欣赏的人来说 xff0c 这个背景显然是很让人感到很不好受 xff0c 所以下面就来看一下如何更换桌面背景 1 单击鼠标右键 2 双击鼠
  • Linux常用工具安装和vim设置的命令实现

    声明 xff1a 本文是针对centos6 0的版本进行安装和设置的 xff0c 在现在下载的Centos版本上基本上会自带一些基本的工具 xff0c 因此在安装之前需要先进行检查 xff0c 如果不存在 xff0c 在进行下载安装 gcc
  • C实现当前机器模式是大端还是小端

    声明 xff1a 本文是在32位机器 xff0c vs2013下运行无误 大小端背景 xff1a 大小端这一词最早是来自 格列夫游记 xff0c 书中记录有一个村子 xff0c 村子里的人有一个强烈的争议 xff0c 关于吃鸡蛋的时候应该从
  • C模拟实现点分十进制IP转换

    声明 xff1a 本文在32位机器上测试无误 点分十进制 点分十进制是计算机网络中的一个名词 xff0c 是一种网络地址的表示方法 xff0c 每一组数字都是在0 255之间 xff0c 每个组之间都是通过 34 34 来进行分割的 xff
  • C面试常考知识点详解

    小结清单 xff1a 指针与引用区别与联系 指针与数组的区别与联系 结构体内存对齐 指针与引用区别与联系 联系 xff1a 底层实现方式相同 xff0c 都是按照指针的方式实现 区别 xff1a 1 引用必须初始化 xff0c 指针可以不用
  • 【通信方式一】管道

    管道引入原因 xff1a 由于各个进程之间是相互独立的 xff0c 这样虽然有助于程序内部自己的处理 xff0c 同时也避免各个进程之间相互影响 xff0c 但是有时候程序之间就是需要进行一些信息传递 xff0c 这时就需要相办法来实现这些
  • Linux下的管道组织管理与容量测试

    管道通信方式实现 xff1a http blog csdn net double happiness article details 71685414 在学习完管道的通信方式之后 xff0c 我们知道管道是用来实现进程之间的相互通信的机制
  • 九大排序之——冒泡排序

    冒泡排序 原意是说鱼从水底下吐泡泡 xff0c 然后一直漂浮到水面上的过程 xff0c 冒泡排序就是不断的将一个元素不断的与后面的元素进行比较 xff0c 如果大于 xff08 升序 xff09 就叫交换两个元素的位置 xff0c 直到比较
  • Python解决opencv,cv2.xfeatures2d的办法

    本来要调一下surf特征检测的包但是报错了 xff0c 在查询以后发现cv2 xfeatures2d在opencv3 4 2 16之后的版本不能使用了 那么只好装一下之前的版本 经过多重尝试 xff0c 最后还是通过whl文件的方法去安装p
  • 九大排序之——堆排序

    堆排序 xff1a 思想 xff1a 首先清楚一点堆的低层存储是一个静态数组 xff0c 可以将它看成是一棵完全二树 先建立初始堆 xff0c 然后进行堆调整 xff0c 在进行交换和pop操作 xff0c 直至完成堆排序为止 堆的分类 x

随机推荐

  • 九大排序之——选择排序

    选择排序 xff1a 思想 xff1a 首先将给定的序列看成是一个有序序列和一个无序序列 xff0c 选择排序也就是从给定 的 序列中选取一个最大的 xff08 最小的 xff09 元素放到有序序列的对应位置 xff0c 再从剩余的无序 序
  • 九大排序之——插入排序

    直接插入排序 xff1a 思想 xff1a 将要排序的序列看成两个序列 xff0c 一个是有序序列 xff0c 另一个是无序序列 xff0c 每次取无序序列中的元素往有序序列中的合适位置插入 xff0c 直到无序序列为空 xff0c 排序完
  • 九大排序之——快速排序

    快速排序 算法思想 xff1a 快速排序从名字上就可以看出就是为了排序的效率 xff0c 每次先选择一个关键字key xff0c 一般是选择序列的第一个元素或者序列的最后一个元素 xff0c 将比key值小的元素全部放在左边 xff0c 将
  • 九大排序之——归并排序

    归并排序 算法思想 xff1a 归并操作整体上来看是分治法的应用 xff0c 不断的划分缩小区间 xff1b 图示 xff1a 算法执行步骤 xff1a 1 先申请一个和原序列一样大的空间 xff0c 用来存放合并之后的序列 xff1b 2
  • 九大排序之——计数排序

    计数排序 计数排序步骤 xff1a 1 找出待排序的数组中最大和最小的元素 xff1b 2 统计数组中每个值为i的元素的出现的次数 xff0c 存入数组C的第i项 xff1b 3 对所有的计数累加 xff1b 4 反向填充目标数组 xff1
  • 九大常见排序总结

    九种常基本排序 希尔排序 xff1a http blog csdn net double happiness article details 70157030 冒泡排序 xff1a http blog csdn net double hap
  • 简单的贪吃蛇游戏实现

    贪吃蛇功能实现 xff1a 1 定义贪吃蛇游戏棋盘图 2 初始化棋盘 3 输出棋盘所在信息 3 选择游戏难度 4 随机产生食物 5 更新游戏动态 6 设置游戏相应的操作 7 打印游戏结果 代码实现 span style font famil
  • 深入理解死锁

    死锁定义 死锁是指两个或两个以上的进程在执行过程中 xff0c 由于资源竞争或者由于彼此通信而造成的一种阻塞现象 xff0c 若无外力作用 xff0c 他们都将无法推进下去 xff0c 此时称系统处于死锁状态 xff0c 这些永远在互相等待
  • GDB调试下的多进程与多线程

    主要方法 1 attach方法 2 follow fork mode方法 背景知识 首先要进行调试 xff0c 我们就不得不先搞清楚调试的一些基本操作 gdb Linux调试器 使用 1 产生调试信息 xff1a 要进行代码的调试 xff0
  • Arch/Manjaro pacman安装google-chrome

    谷歌浏览器在Linux下存在好几个版本 xff0c 开源chromuim是默认提供版本 不过个人还是觉得原生版本google chrome stable 最好用 xff01 这个版本存在于清华软件源 xff0c 所以先添加 xff1a ar
  • Linux下的信号(一)

    信号主要是用于不同进程之间进行通信的机制 xff0c 进程之间的相互协作也正是通过发送信号来完成的 xff0c 而信号的本质就是修改PCB中关于信号变量的某个比特位 xff08 至于为什么是一个比特位 xff0c 随后就会做出解释 xff0
  • 浅析重载、隐藏与覆盖

    重载 重载又称为静态多态 xff0c 静态绑定 xff0c 静态决议等 因为要实现重载 xff0c 所以C 43 43 和C的命名方式有所不同 重载主要是为了减轻程序员对函数名的记忆负担 xff0c 让所有功能相似的函数使用同一名字 重载条
  • Linux下的信号(二)

    相关博客 Linux下的信号 xff08 一 xff09 http blog csdn net double happiness article details 72848372 信号的四种产生方式 一 通过键盘上的某些组合键完成 二 由硬
  • 深入理解信号阻塞实现原理

    相关博文 xff1a Linux下的信号 xff08 一 xff09 http blog csdn net double happiness article details 72848372 Linux下的信号 xff08 二 xff09
  • 信号捕获之pause函数和竟态条件(mysleep)

    相关博客 Linux下的信号 xff08 一 xff09 http blog csdn NET double happiness article details 72848372 Linux下的信号 xff08 二 xff09 http b
  • 关于子进程异步等待方式(SIGCHLD信号)

    相关博客 Linux下的信号 xff08 一 xff09 http blog csdn NET double happiness article details 72848372 Linux下的信号 xff08 二 xff09 http b
  • 【进程间通信方式二】消息队列

    进程间通信 xff08 IPC xff09 主要包括了管道 系统IPC xff08 包括了消息队列 信号及共享存储 xff09 和套接字 xff08 SOCKET xff09 IPC方法包括管道 xff08 PIPE xff09 消息队列
  • 【面试题】字符串旋转

    题目描述 xff1a 给定一个字符串aabcd要求将其左旋两位 xff08 即旋转后变成bcdaa xff09 代码实现 xff1a span style font size 18px include lt stdio h gt inclu
  • linux下的crond&&crontab

    基本概念 1 crond和crontab是不可分割的 xff0c crontab是一个命令 xff0c 常用于Unix Linux系统之中 xff0c 用于设置周期性被执行的指令 2 crontab命令常用于从标准输入设备中读取指令 xff
  • 终端与作业控制

    strong span style font family none font size 24px 进程组 span strong span style font family none font size 18px 1 简单来说进程组就是