Linux进程通信:进程组 会话

news2024/11/26 14:34:18

1. 进程组

(1)概念:一个或多个进程的集合,也称为“作业”。

(2)父进程创建子进程时,默认属于同一个进程组。进程组ID为组长进程ID。

(3)进程组中只要有一个进程存在,进程组就存在,与组长进程是否终止无关。

(4)父子进程可不属于同一进程组。


进程组相关函数

(1)getpgrp函数

#include<unistd.h>

pid_t getpgrp(void);
/*
功能:
    获取当前进程的进程组ID
返回值:
    总是成功。
*/

(2)getpgid函数

#include<unistd.h>

pid_t getpgid(pid_t pid);
/*
功能:
    获取指定进程的进程组ID
参数:
    pid:进程号;若为0,则功能和getpgrp一样
返回值:
    成功:进程组ID
    失败:-1
*/

(3)setpgid函数

#include<unistd.h>

int setpgid(pid_t pid, pid_t pgid);
/*
功能:
    将进程pid的进程组改为pgid;可创建新的进程组
返回值:
    成功:0
    失败:-1
*/

2. 会话

概念:一个或多个进程组的集合。

创建会话注意事项:

(1)组长进程不能创建会话,否则返回出错;

(2)创建会话的非组长进程变成新会话的首进程(session header,也称为会长进程),同时会创建一个新进程组并成为组长进程(因为新会话中至少要有一个进程组);

(3)组长进程不会成为新会话首进程,新会话首进程会成为组长进程;

(4)需要root权限(Ubuntu等除外);

(5)新会话丢弃原有控制终端,该会话无控制终端;

(6)创建新会话时:先调用fork,父进程终止,子进程调用setsid(创建会话函数);

会话相关函数:

(1)getsid函数:

#include<unistd.h>

pid_t getsid(pid_t pid);
/*
功能:
    获取进程所属的会话
参数:
    pid:进程号;若为0则表示查看当前进程的会话ID
返回值:
    成功:会话ID
    失败:-1
*/

getsid示例:

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

int main(int argc, const char* argv[]) {

    pid_t pid = -1;

    // 获取当前进程组会话ID
    pid = getsid(0);
    if (-1 == pid) {
        perror("getsid");
        return 1;
    }

    printf("当前进程的会话ID:%d\n", pid);

    return 0;
}

运行结果:

(2)setsid函数

#include<unistd.h>

pid_t setsid(void);
/*
功能:
    创建新会话,并用自己的ID设置为新进程组ID和新会话ID;
    该进程将成为新进程组组成和新会话会长。
返回值:
    成功:新会话ID;
    失败:-1.
*/

setsid示例:

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

int main(int argc, const char* argv[]) {

    pid_t pid = -1;

    printf("父进程pid:%d\n", getpid());
    printf("父进程所属进程组的组长进程pid:%d\n", getpgrp());
    printf("父进程所属会话的会长进程pid:%d\n", getsid(0));

    // 创建新会话
    printf("父进程%d即将创建新会话...\n", getpid());
    pid = setsid(); // 失败
    if (-1 == pid) {
        printf("创建失败!父进程为组长进程,组长进程不可创建新会话..\n");
        perror("setsid");
    }

    pid = fork();
    if (-1 == pid) {
        perror("fork");
        return 1;
    }

    if (0 == pid) {  // 子进程
        printf("\n子进程创建成功!其pid:%d,其组长进程:%d\n", getpid(), getpgrp());
        printf("子进程%d即将创建新会话...\n", getpid());
        pid = setsid(); // 创建会话
        if (-1 == pid) {
            perror("setsid");
            return 1;
        }
        printf("子进程创建新会话成功\n");
        printf("子进程所属进程组的组长进程pid:%d\n", getpgrp());
        printf("子进程所属会话的会长进程pid:%d\n", getsid(0));
        printf("子进程的父进程pid:%d\n", getppid());
    } else {
        sleep(2);
        printf("\n子进程创建会话后,父进程情况:\n");
        printf("父进程所属进程组的组长进程pid:%d\n", getpgrp());
        printf("父进程所属会话的会长进程pid:%d\n", getsid(0));
        while (1) {
            sleep(1);
        }
    }
    return 0;
}

运行结果:

结果可知:

(1)组长进程不可创建新会话;

(2)非组长进程(这个示例中的子进程)创建新会话后会成为新会话的会长,同时也会创建一个新进程组并成为组长(因为新会话中至少要有一个进程组)

(3)子进程创建新会话成为新会长和新组长后,并不会影响父进程的组长和会长;

(4)父子进程可不属于同一个进程组,也可不属于同一会话。

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

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

相关文章

unity中的Line Renderer

介绍 unity中的Line Renderer 方法 首先&#xff0c;Line Renderer 是 Unity 引擎中的一个组件&#xff0c;它可以生成直线、曲线等形状&#xff0c;并且在场景中呈现。通常情况下&#xff0c;Line Renderer 被用来实现轨迹、路径、线框渲染以及射线可视化等功能。 在使用 …

imx6ull开发板环境配置 - libusb、libudev、eudev交叉编译

目录 零、前言 一、libusb交叉编译 1.0 前言 1.1 交叉编译 二、usbutils交叉编译 2.0 前言 2.1 交叉编译 三、libudev交叉编译 3.0 前言 3.1 交叉编译 3.2 错误处理-没找到usbutils 3.3 错误处理-没找到pci.ids &#xff08;pci.ids not found&#xff09; 3.3.0 前…

【数据库】索引与事务

目录 1、索引 1.1、概念 1.2、索引的作用 1.3、 索引的缺点 1.4、数据库中实现索引的数据结构 1.4.1、B树/B-树 1.4.2、B树 1.4.3、回表 1.5、使用场景 1.6、索引的使用 1.6.1、查看索引 1.6.2、创建索引 1.6.3、 删除索引 1.7、索引的分类 2、事务 2.1、为什…

Arduino ESP8266基于ESPAsyncWebServer 网页GPIO控制

Arduino ESP8266基于ESPAsyncWebServer 网页GPIO控制 📍相关篇《Arduino ESP8266利用AJAX局部动态更新网页内容》 📺控制页面演示: 🌿在手机上可以通过接入ESP8266的WIFI,通过浏览器方位192.168.4.1进行网页页面操控引脚以及查看esp8266信息。 ✨本项目是基于github上…

[oeasy]python0143_主控程序_main

主控程序 回忆上次内容 上次把 apple.py 拆分成了 输入主函数 引用模块中变量的时候 要带上包(module)名 get_fruits.aget_fruits.b 最终 拆分代码 成功&#xff01; 可以将程序 再拆分成 输入输出 然后 再由主函数调用吗&#xff1f;&#x1f914; 建立主控 新建一个 ma…

【Java笔试强训 10】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;井字棋 …

大数据技术之大数据概论

第1章 大数据概念 大数据(Big Data): 指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产 大数据主要解决&#xff0c;海量数据的采集、存…

【吴恩达推荐】《ChatGPT Prompt Engineering for Developers》- 知识点目录

《ChatGPT Prompt Engineering for Developers》 1 Introduction 2 Guidelines Principle 1: Write clear and specific instructions Tactic 1: Use delimiters Tactic 3: “If-statement” Check whether conditions are satisfiedCheck assumptions required to do the …

RDD的Stage划分原理

1. 什么是RDD RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做分布式数据集&#xff0c;是Spark 中最基本的数据抽象&#xff0c;它代表一个不可变、可分区、里面的元素可并行计算的集合。在Spark 中&#xff0c;对数据的所有操作不外乎创建RDD、转化已有RDD 以…

JavaBeaneljstl

1.JavaBean 1.1 什么是JavaBean JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean&#xff0c;类必须是具体的和公共的&#xff0c;并且具有无参数的构造器 简单一点&#xff1a;建一个类,给一个无参的构造方法. 它就是JavaBean&#xff0c;对应JavaBean来说&#x…

【C++】程序员的屠龙母鸡:二叉树进阶OJ题详解

不会自动生成&#xff0c;还是我自己写目录吧 -.- 文章目录 前言一、稍微简单一点的二叉树OJ题二、相对困难一点的二叉树OJ题总结 前言 在看这篇文章前希望大家是学过二叉树的&#xff0c;不然理解起来可能会比较费劲&#xff0c;但我会尽自己的努力让大家学会这些题&#xf…

TensorFlow会被JAX代替吗,使用JAX训练第一个机器学习模型

上期文章我们分享了JAX的概念&#xff0c;Jax 是来自 Google 的一个相对较新的机器学习库。它更像是一个 autograd 库&#xff0c;可以区分每个本机 python 和 NumPy 代码。 “PythonNumPy 程序的可组合转换&#xff1a;微分、向量化、JIT 到 GPU/TPU 等等”。该库利用 grad 函…

vue 视频播放插件vue-video-player自定义样式

1、背景 项目中有涉及视频播放的需求&#xff0c;并且UI设计了样式&#xff0c;与原生的视频video组件有差异&#xff0c;所以使用了vue-video-player插件&#xff0c;并对vue-video-player进行样式改造&#xff0c;自定义播放暂停按钮、全屏按钮、时间进度条样式等 2、效果图…

10分钟叫你如何学会组织Prompt语言同AI沟通

提示词&#xff08;Prompt&#xff09;是与AI模型交流的语言&#xff0c;用以告诉AI模型想要生成的图像的特征。提示词的准确性、精准度直接决定了生成的图像是否符合我们的预期。 基础介绍 AIGC提示词通常由多个单词、词组或短句构成&#xff0c;以***,***分割组成&#xff…

如何更改Windows服务器时间

Windows操作系统自带时间同步功能&#xff0c;它会自动从互联网时间服务器获取时间&#xff0c;以保证系统时间的准确性。但是&#xff0c;有时候我们需要更改时间服务器&#xff0c;以获得更准确的时间同步。小编将为大家介绍如何更改Windows时间服务器&#xff0c;以及Window…

java基础知识——22.lambda表达式

这篇文章&#xff0c;我们来讲一下java的lambda表达式 目录 1.初识lambda表达式 2.lambda表达式介绍 2.1 函数式编程 2.2 lambda表达式的具体格式 2.3 Lambda表达式的好处 2.4 Lambda的省略写法 1.初识lambda表达式 首先&#xff0c;我们来看一下lambda表达式的应用 下…

运维——ssh无法登录云服务器

0x00 概述 一般来讲&#xff0c;无法登录ssh的原因挺多&#xff0c;如果无法登录云服务器&#xff0c;则除了要检查ssh端口是否放行&#xff0c;防火墙状态外&#xff0c;还需要检查云服务器web控制台入站规则是否开放了对应端口。如果你前面检查都是正常&#xff0c;那么还需…

实战打靶集锦-017-potato

提示&#xff1a;本文记录了博主的一次打靶过程 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Apache探查4.2 ProFTPD探查4.2.1 strcmp()函数绕过4.2.2 查找apache日志文件4.2.3 查看/etc/passwd文件4.2.4 破译密码4.2.5 突破边界 5. 提权5.1 系统信息枚举5.2 定时任…

基于Yolov5的NEU-DET钢材表面缺陷检测,优化组合新颖程度较高:CVPR2023 DCNV3和InceptionNeXt,涨点明显

1.钢铁缺陷数据集介绍 NEU-DET钢材表面缺陷共有六大类,分别为:crazing,inclusion,patches,pitted_surface,rolled-in_scale,scratches 每个类别分布为: 训练结果如下: 2.基于yolov5s的训练 map值: 2.1 Inception-MetaNeXtStage 对应博客:https://cv2023.blog.csdn.n…

实验5 彩色图像处理与图像变换

文章目录 一、实验目的二、实验内容1. 彩色图像平滑。(课本P310 例6.12)2. 彩色边缘检测。(课本P318 例6.16)3. 一维小波变换。(课本P364 例7.20)4. 二维小波变换。(课本P369 例7.22)5. 小波包分解。(课本P376 例7.24) 一、实验目的 掌握RGB彩色模型和HSI彩色模型之间的转换方…