进程间关系

news2025/6/25 5:47:43

目录

亲缘关系

进程组关系

会话关系

孤儿态进程


亲缘关系

亲缘关系主要体现于父子进程,子进程父进程创建,代码继承于父进程,父进程负责回收,子进程诞生至结束父进程全程参与,这种称为强亲缘关系。

系统开机后(字符Linux系统无UI)如何创建第一个终端:

终端子进程:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
    printf("son %d ,parent %d\n",getpid(),getppid());
    while(1)
        sleep(1);
}

前台才能用命令,当前这个zhong是前台所以终端不能用命令了,终端子进程默认情况下也是唯一的前台进程。

或者是有加号的是前台。

进程组关系

进程组是一种系统管理单位,进程管理器进行组划分,组转化转义,便于系统管理多进程。

一个进程组是由一个组长进程N个组员进程构成。进程组长的唯一标识,pid=pgid。

终端子进程被创建均为组长进程。

普通进程的生命周期随着使用时长持续。

进程组中直到最后一个进程终止或转移,进程组为空,系统会释放进程组。

就近原则,组长进程创建子进程,都会默认归纳到同组,成为组员进程。

进程组的成员可以转移,变为其他组成员,进程组概念与亲缘概念没有必然联系。

大多数系统不允许组长变更。

getpgrp();返回进程组id

setpgid(pid_t pid,pid_t pid);//创建进程组或转移进程组。

创建进程,组长不允许使用,组员进程可以set(getpid(),getpid()),组员申请组,组id是自己id。

转移进程,组长无法转移,setpid(3000,5000);//3000转移到5000这个组。目标组得存在,并且对目标组有权限才能转移成功。

转移到别的组代码:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
    pid_t pid;
    int i;
    for(i=0;i<3;i++)
    {
      pid=fork();
      if(pid==0)break;
    }
    if(pid>0){
    printf("parent %d,group %d\n",getpid(),getpgrp());
    while(wait(NULL)>0);
    }
    else if(pid==0){
    printf("child %d,group %d,i %d\n",getpid(),getpgrp(),i);
    if(i==2){
        sleep(5);
        printf("create group\n");
        setpgid(getpid(),getpid());
        printf("child pid %d,group %d,i %d\n",getpid(),getpid(),i);
    }
    while(1)sleep(1);
    }
    else{
        printf("fork fail\n");
        exit(0);
    }
    return 0;
}

会话关系

一个终端下可能有终端子进程和其他终端进程构成,为了便于管理这些终端进程,使用会话关系管理。

会话由一个会话发起者和若干个会话参与者构成。会话发起者标志pid=gid=sid;

会话发起者结束后按组杀死参与者,杀死终端子进程的那一组。

getsid(getpid())//返回当前进程会话id

setsid()//创建新会话(创建组->创建会话)

终端子进程无法脱离终端必然被杀死。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
    pid_t pid;
    int i;
    for(i=0;i<3;i++){
      pid=fork();
      if(pid==0)break;
    }
    if(pid>0){
    printf("parent %d,group %d\n",getpid(),getpgrp());
    while(wait(NULL)>0);
    }
    else if(pid==0){
    printf("child %d,group %d,i %d,sid %d\n",getpid(),getpgrp(),i,getsid(getpid()));
    while(1)sleep(1);
    }
    else{
        printf("fork fail\n");
        exit(0);
    }
    return 0;
}

一组都杀没了。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
    pid_t pid;
    int i;
    for(i=0;i<3;i++){
      pid=fork();
      if(pid==0)break;
    }
    if(pid>0){
    printf("parent %d,group %d\n",getpid(),getpgrp());
    while(wait(NULL)>0);
    }
    else if(pid==0){
    printf("child %d,group %d,i %d,sid %d\n",getpid(),getpgrp(),i,getsid(getpid()));
    if(i==2){
        sleep(5);
        printf("create group\n");
        setsid();
        printf("child pid %d,group %d,i %d,sid %d\n",getpid(),getpid(),i,getsid(getpid()));
    }
    while(1)sleep(1);
    }
    else{
        printf("fork fail\n");
        exit(0);
    }
    return 0;
}

关闭后6258躲过一劫。

孤儿态进程

父进程先于子进程退出,子进程失去管理,变为孤儿进程。

进程变为孤儿,父进程变更变为托管进程。所有孤儿进程结束后托管进程(upstart user可视化进程,在ubuntu14.04的版本为1init进程后续版本是init的子进程)负责处理这些僵尸进程,避免内存泄漏。

托管进程不干预孤儿进程执行,只是负责回收。

孤儿进程残留影响新进程的创建。孤儿进程的危害是弹性的,取决于孤儿进程的工作,如果孤儿进程持续申请系统资源,危害较大。

(错误信息的抛出:假如fork()失败返回-1,系统会有个errno记录,假如error=3,perror("fork error")找这个3在系统这个错误文件里找到对应错误的原因->STDERR_FIENO->使用用户自定义语句和错误信息进行拼接。)

孤儿进程是后台进程,由于父进程也没有了所以也不会出现像上面被一组杀死这种情况。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
    pid_t pid;
    pid=fork();
    if(pid>0){
        exit(0);
    }
    else if(pid==0){
        while(1){
            sleep(6);
            printf("家人们谁懂啊,孤儿了\n");
        }
    }
    else{
        exit(0);
    }
    return 0;
}

这里能看出是后台进程。

这里能看见由于我们是老版本所以1号进程是托管进程。

怎么早发现早处理孤儿进程:

1.利用管道的特性处置孤儿进程,读端关闭,写端杀死。

2.kill(parent_pid,0)//测试进程是否存活。pthread_kill(tid,0)//测试线程是否存活。

要是多组的话那就很麻烦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1954385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业级数据分析平台合集介绍

企业发展离不开数据分析&#xff0c;数据分析推动着企业运营、决策和战略规划。它正逐步深入到各行各业的核心业务流程中&#xff0c;从传统的金融、零售、制造业扩展到医疗健康、教育、能源等更多领域。企业正通过数据分析平台实现数据资源的最大化利用&#xff0c;推动业务与…

wireshark--流量分析利器

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

基于微信小程序的课堂考勤系统的设计与实现(论文+源码)_kaic

基于微信小程序的课堂考勤系统的设计与实现 摘 要 在高校教育普及的今天&#xff0c;学生人数日益增多&#xff0c;为保证课堂质量&#xff0c;教师多要在课前进行考勤。因此本设计提出基于微信小程序的课堂考勤系统&#xff0c;增加了定位功能&#xff0c;避免了“假打卡”…

探索大型语言模型LLama 2:原理揭秘与代码实践

一、引言 1.1 大型语言模型的重要性 大型语言模型作为人工智能领域的重要研究方向&#xff0c;近年来取得了显著的成果。这些模型在自然语言处理、机器翻译、对话系统、文本生成等领域展现了强大的能力&#xff0c;为人类带来了诸多便利。大型语言模型的出现&#xff0c;使得…

卓码软件测评:软件功能测试和非功能测试详情介绍

随着信息技术的不断发展&#xff0c;软件在我们日常生活与工作中扮演着越来越重要的角色。然而&#xff0c;软件质量的好坏直接关系到使用者的体验和企业的声誉。在软件开发过程中&#xff0c;功能测试和非功能测试作为保证软件质量的重要手段&#xff0c;受到了越来越多的关注…

web后端--Spring事务管理

事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下&#xff0c;只有出现RunTimeException才会回滚事务&#xff0c;rollbackfor属性用于控制出现何种异常类型&#xff0c;回滚…

Flink内存管理机制

前言 在Flink的后台界面&#xff0c;可以看到整个Flink的内存情况。 如JobManager的内存情况&#xff1a; TaskManager的内存情况 一、Flink内存管理 Flink TaskManager内存组成整体结构图如下&#xff1a; 二、总内存管理 三、JobManager内存管理内存管理 四、TaskManager内…

运算符优先级、赋值运算符、一元运算符、逻辑运算符

运算符优先级 字符串 布尔 null undefined 赋值运算符 一元运算符 逻辑运算符 && 逻辑与 ||逻辑或 &#xff1f;&#xff1f;空值合并运算符 称为空值合并运算符&#xff0c;它是ES6的一个新特性&#xff0c;它的作用是当一个表达式是nul或者undefined时为变量设…

Pip换源使用帮助

PyPI 镜像使用帮助 PyPI 镜像帮助提高包安装的速度&#xff0c;特别是当默认源访问较慢时。镜像每次同步成功后&#xff0c;每隔 5 分钟进行更新&#xff0c;确保镜像内容尽量与官方源保持一致。 pip 临时使用 如果您只想在一次安装中使用镜像&#xff0c;可以使用以下命令&…

嵌入式到底是啥嵌入了啥?

嵌入式系统&#xff08;Embedded System&#xff09;是指一个专用的计算机系统&#xff0c;它作为一个装置或系统的一部分被嵌入其中&#xff0c;来实现特定的功能。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习…

项目比赛经验分享:如何让即兴发言出彩

项目比赛经验分享&#xff1a;如何让即兴发言出彩 前言1. 顺势趁便法2. 词语撮要法3. 起承转合法4. 数字串连法结语 在项目管理和比赛的激烈竞争中&#xff0c;即兴发言往往成为展示个人魅力和团队精神的重要环节。如何在短时间内组织语言&#xff0c;表达清晰、有力的观点&…

Python代码规范!详细说明!

背景 最近在协作开发过程中&#xff0c;遇到了诸多问题。总结下来主要有两点大问题 代码风格不统一&#xff0c;代码习惯问题严峻。系统解耦不清晰&#xff0c;信息传输不清晰。 于是打算针对市面上常见的代码规范进行强调&#xff0c;结果在查看Google python代码规范文档的…

098、Python 通过编程实现发送邮件的方法

要通过Python编程实现发送邮件&#xff0c;首先得先登录自己的发送邮箱对发送进行相关设置。 一、进行发送邮箱相关设置 1、如下图&#xff0c;点击设置->POP3/SMTP/IMAP 2、然后开启POP3/SMTP服务&#xff0c;并获取授权码和SMTP服务器的地址&#xff0c;如下图&#xff…

Dify中HTTP请求节点的常见操作

HTTP节点包括API请求类型&#xff08;GET、POST、HEAD、PATCH、PUT、DELETE&#xff09;&#xff0c;鉴权类型&#xff08;无、API-Key基础、API-Key Bearer、API-Key自定义&#xff09;&#xff0c;HEADERS键值设置&#xff0c;PARAMS键值设置&#xff0c;BODY&#xff08;non…

springboot高校生就业系统-计算机毕业设计源码99877

基于内容过滤算法的高校生就业系统的设计与实现 摘 要 在当今信息时代&#xff0c;学校以学生信息管理为导向&#xff0c;企业以学生就业持续创新为目标。为满足这一需求&#xff0c;设计一款高校生就业信息管理系统至关重要。该系统涵盖了系统用户管理、岗位信息管理、企业展示…

Channel应用示例

本地文件写数据,如果没有文件创建文件 /*** 使用ByteBuffer(缓冲)和FileChannel(通道),将Hello NIO写入到file01.txt文件中* 如果文件不存在创建文件* author hrui* date 2024/7/27 22:27*/ public class NIOFileChannel01 {public static void main(String[] args) throws I…

Vue element ui分页组件示例

https://andi.cn/page/621615.html

7-23学习笔记

一、异常 即程序中一些程序处理不了的特殊情况 Exception 能被程序本身处理( try-catch )&#xff0c; Error 是无法处理的(只能尽量避免)。 1、异常类 Exception 见过的异常 NullPointerException ArrayIndexoutOfBoundException等 String strnull;System.out.println(st…

昇思MindSpore学习入门-静态图高级编程技巧

如何优化编译性能 使用lazy_inline装饰器 神经网络模型的编译过程往往采用默认inline的方式&#xff0c;把层级的代码表达最终展开成一张扁平的计算图&#xff0c;一方面寻求最大的编译优化机会&#xff0c;另一方面也可以简化自动微分以及执行的逻辑。inline后形成的计算图包…

ODBC的基本使用

前言 在工作中&#xff0c;使用POWERBI做数据分析报表的时候用到ODBC&#xff0c;对于POWERBI语义模式实现连接数据库必须使用到ODBC&#xff0c;那什么是ODBC&#xff1f; 1.ODBC的基本概念 1.1ODBC 驱动程序 每种数据库都有相应的 ODBC 驱动程序&#xff0c;这些驱动程…