首页 > 系统相关 >【Linux】进程间的关系(第十三篇)

【Linux】进程间的关系(第十三篇)

时间:2024-09-04 15:22:34浏览次数:11  
标签:关系 printf pid 会话 getpid Linux 进程 十三篇

目录

1.亲缘关系:

2.进程组关系:

3.会话关系

4.进程、进程组与会话的关系

5.例子


1.亲缘关系:

2.进程组关系:

3.进程间会话关系


1.亲缘关系:

多个进程间可能存在亲缘关系(多个进程间可能是父子进程结构,也可能更为复杂的层级亲缘结构)

2.进程组关系:

  • 定义:进程组是一个或多个进程的集合。每个进程除了有一个进程ID(PID)之外,还属于一个进程组。每个进程组有一个唯一的进程组ID(PGID)。
  • 组长进程:每个进程组都可以有一个组长进程,其标识是进程组ID等于其进程ID。组长进程可以创建一个进程组,并在其中创建其他进程。重要的是,只要进程组中有一个进程存在,该进程组就继续存在,这与组长进程是否终止无关。
  • 作用:进程组通常与作业相关联,可以接收来自同一终端的各种信号。

示例:略(一父多子)

  pid_t pid;
    for(int i =0; i<3;i++){
          pid = fork();
          if(pid ==0){
               break;
          }
 
    }
     if(pid >0){
         printf("parent process %d\n,group id %d\n",getpid(),getpgrp());
        // while(1)sleep(1);
     }else if(pid ==0){
         printf("child process %d,group id %d\n",getpid(),getpgrp());
        // setpgid(getpid(),setpgrp());
         //父亲死后,
         printf("setpgid child process %d,group id %d\n",getpid(),getpgrp());
 
         while(1)sleep(1);
     }
​

ps ajx 查看进程关系 ps aux 查看进程信息:

进程组关系与亲缘关系没有必然联系,组成员可能构成复杂,频繁变动 创建进程组,转移组中进程,获取PGID setpgid(pid_t pid,pid_t pgid) 转移进程,将pid的进程转到pgid的组,转移的组必须存在 (注意:创建进程组,使用pid 申请pgid,传参时两个参数相等) 父进程默认为进程组组长,无法使用setpgid进行组创建,子进程和非组长进程可以

示例:略(子进程申请进程组)

getpgrp()

无论进程组如何变动,亲缘关系始终保持不变,父进程一定要对子进程进行回收操作(无论子进程组情况如何复杂)

3.会话关系

  • 定义:会话是一个或多个进程组的集合。一个会话有一个控制终端,这通常是登录到其上的终端设备或伪终端设备。
  • 控制进程:建立与控制终端连接的会话首进程被称为控制进程。一个会话中的进程组可被分为一个前台进程组以及一个或多个后台进程组。
  • 作用:会话的意义在于将多个工作囊括在一个终端,并且取其中的一个工作作为前台,来直接接受该终端的输入输出以及终端信号。其他的工作在后台运行。
   pid_t pid = fork();
    if(pid ==0){
    pid_t sid = setsid();
      printf("sid %d\n",sid);
            printf("child process %d ,group id %d,session %d\n",getpid(),getpgrp(),getsid(0));
          while(1)sleep(1);
      }else if(pid >0){
             printf("parent process %d,session %d\n",getpid(),getsid(0));
             while(1)sleep(1);
      }
​

4.进程、进程组与会话的关系

  • 一个进程可以属于一个进程组,而一个进程组又可以属于一个会话。这种层级关系使得系统能够更好地管理和控制进程的执行。
  • 进程组是系统分配资源或发送信号给一组进程的基础,而会话则是对这些进程组的更高层次的抽象和组织。

5.例子

  • 当用户通过终端登录系统时,系统会为该用户启动一个Shell进程,并为其分配一个会话和一个控制终端。这个Shell进程就是这个会话的控制进程,也是前台进程组的组长进程。
  • 用户可以在Shell中启动多个进程,这些进程默认属于Shell所在的进程组和会话。用户可以使用Shell的命令(如&fgbg等)来控制这些进程的运行状态,如将进程放到后台运行或将其提到前台运行。
  • 如果一个进程组的组长进程退出了,但该进程组中的其他进程还在运行,那么这个进程组依然存在,并由init进程(PID为1的进程)接管。

综上所述,进程间的关系是通过进程组、会话等概念来组织和管理的。这种层级关系使得系统能够更有效地管理和控制进程的执行,同时也提高了系统的灵活性和可扩展性。

标签:关系,printf,pid,会话,getpid,Linux,进程,十三篇
From: https://blog.csdn.net/abclui/article/details/141884729

相关文章

  • 【Linux】孤儿进程(第十二篇)
    目录孤儿进程定义产生原因处理机制特性与影响示例守护进程(daemon)定义:特点:与孤儿进程的区别:孤儿进程孤儿进程是操作系统中的一个概念,主要出现在类UNIX操作系统中。以下是关于孤儿进程的详细解释:定义孤儿进程指的是在其父进程执行完成或被终止后,仍继续运行的......
  • MYSQL-Linux安装
    MySQL8.0.26-Linux版安装1.准备一台Linux服务器云服务器或者虚拟机都可以;Linux的版本为Centos7;2.下载Linux版MySQL安装包https://downloads.mysql.com/archives/community3.创建目录、解压mkdirmysq1//创建目录tar-xvfmysql安装包.x8664.rpm-bundle.tar-Cmysql/......
  • Linux keepalive
    安装1,安装 https://www.cnblogs.com/lfxx/p/17876757.htmlhttps://www.cnblogs.com/wangchengshi/p/10912177.html 2,linuxkeepalived日志,如何重定向Keepalived日志的输出路径https://blog.csdn.net/weixin_39935571/article/details/116731816https://www.......
  • Linux之curl详解
    curl是一个非常强大的命令行工具,用于发送和接收数据,支持多种协议,如HTTP、HTTPS、FTP等。它被广泛用于测试、调试Web接口以及自动化脚本中。下面是对curl的详细解释,包括其基本用法和一些高级特性。基本用法发送HTTPGET请求bashcurlhttp://example.com这个命令会......
  • 轻松上手 | 基于RockyLinux 9.4安装部署Zabbix 7.0
    作者乐维社区(forum.lwops.cn)许远2024年6月30日,CentOS停止更新和维护,不少企业用户开始寻求新的替代方案。RockyLinux,一个开源、社区拥有和管理、免费的企业Linux发行版,提供强大的生产级平台,可作为CentOS停止维护(改为滚动更新的Stream版)后,RHEL的下游Linux操作系统替代方案,并继......
  • Linux基础入门 --5 DAY
    移动和重命名文件    mv命令可以实现文件或目录的移动或改名    同一分区移动数据,速度快:数据位置未变化    不同分区移动数据,速度相对较慢,数据位置发生了变化    格式:mv[OPTION]...[-T] SOURCE DESTmv[OPTION]...SOURCE...DIRE......
  • Linux下makefile 编译项目
    1、规划makefile编写a、根目录下放三个文件:1、makefile:是咱们编译项目的入口脚本,编译项目从这里开始,起总体控制作用。2、config.mk:配置脚本,被makefile包含,单独分处理,为了应付一些可变的东西。3、common.mk:最核心的编译脚本,定义makefile编译规则,并且各个子目录中都用到这个来编译.......
  • Android开机流程-从Init进程启动到进入Android桌面
    1.init进程启动流程Androidbootloader负责加载boot.img,将其内容放入内存,然后启动内核。内核接管之后,会解压并加载ramdisk到内存中,然后启动用户空间的第一个进程init。在Android系统启动过程中,ramdisk.img被内核直接解压到内存中并用作初始根文件系统。这一过程不是通过......
  • Linux C++ 多线程高并发服务器实战项目一
    1、项目介绍1、按照包头+包体的格式收发数据包,解决粘包的问题2、非常完整的多线程高并发服务器3、根据收到数据包执行,不同的业务逻辑函数用到的技术:epoll高并发通讯技术,用的是水平触发【LT】水平触发模式通过线程池技术处理业务逻辑多线程、之间同步技术使用,互斥量、和条件变......
  • linux下graphviz离线安装指南及报错解决方式
    在联网的机器上下载Graphviz的源码包:网址:Graphviz下载地址将下载的安装包copy到linux下,解压后,在解压目录下执行安装tar-xvfgraphviz-12.1.0.tar.gzcdgraphviz-12.1.0./configure--prefix=/your_want_install_path/makemakeinstall注:我在执行make命令时报......