Linux--进程组、会话、守护进程

华硕ROG枪神双系统实战:Ubuntu安装避坑指南 本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。 阅读详情

原文链接:http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html


进程组
  一个或多个进程的集合
  进程组ID: 正整数
  两个函数
  getpgid(0)=getpgrp()


eg:显示子进程与父进程的进程组id

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

int main() {
    pid_t pid;

    if ((pid=fork())<0) {
        printf("fork error!");
    }else if (pid==0) {
        printf("The child process PID is %d.\n",getpid());
        printf("The Group ID is %d.\n",getpgrp());
        printf("The Group ID is %d.\n",getpgid(0));
        printf("The Group ID is %d.\n",getpgid(getpid()));
        exit(0);
    }

    sleep(3);
    printf("The parent process PID is %d.\n",getpid());
    printf("The Group ID is %d.\n",getpgrp());

    return 0;
}


进程组id = 父进程id,即父进程为组长进程

 

组长进程
  组长进程标识: 其进程组ID==其进程ID
  组长进程可以创建一个进程组,创建该进程组中的进程,然后终止
  只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关
  进程组生存期: 进程组创建到最后一个进程离开(终止或转移到另一个进程组)
 
一个进程可以为自己或子进程设置进程组ID
  setpgid()加入一个现有的进程组或创建一个新进程组


eg:父进程改变自身和子进程的组id

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

int main() {
    pid_t pid;

    if ((pid=fork())<0) {
        printf("fork error!");
        exit(1);
    }else if (pid==0) {
        printf("The child process PID is %d.\n",getpid());
        printf("The Group ID of child is %d.\n",getpgid(0)); // 返回组id
        sleep(5);
        printf("The Group ID of child is changed to %d.\n",getpgid(0));
        exit(0);
    }

    sleep(1);
    setpgid(pid,pid); // 改变子进程的组id为子进程本身
    
    sleep(5);
    printf("The parent process PID is %d.\n",getpid());
    printf("The parent of parent process PID is %d.\n",getppid());
    printf("The Group ID of parent is %d.\n",getpgid(0));
    setpgid(getpid(),getppid()); // 改变父进程的组id为父进程的父进程
    printf("The Group ID of parent is changed to %d.\n",getpgid(0));

    return 0;
}


会话: 一个或多个进程组的集合
  开始于用户登录
  终止与用户退出
  此期间所有进程都属于这个会话期


建立新会话:setsid()函数
  该调用进程是组长进程,则出错返回
    先调用fork, 父进程终止,子进程调用
  该调用进程不是组长进程,则创建一个新会话
    •该进程变成新会话首进程(session header)
    •该进程成为一个新进程组的组长进程。
    •该进程没有控制终端,如果之前有,则会被中断
组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程...


会话ID:会话首进程的进程组ID
获取会话ID: getsid()函数


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

int main() {
    pid_t pid;

    if ((pid=fork())<0) {
        printf("fork error!");
        exit(1);
    }else if (pid==0) {
        printf("The child process PID is %d.\n",getpid());
        printf("The Group ID of child is %d.\n",getpgid(0));
        printf("The Session ID of child is %d.\n",getsid(0));
        sleep(10);
        setsid(); // 子进程非组长进程,故其成为新会话首进程,且成为组长进程。该进程组id即为会话进程
        printf("Changed:\n");
        printf("The child process PID is %d.\n",getpid());
        printf("The Group ID of child is %d.\n",getpgid(0));
        printf("The Session ID of child is %d.\n",getsid(0));
        sleep(20);
        exit(0);
    }

    return 0;
}


在子进程中调用setsid()后,子进程成为新会话首进程,且成为一个组长进程,其进程组id等于会话id


 守护进程
  Linux大多数服务都是通过守护进程实现的,完成许多系统任务
  0: 调度进程,称为交换进程(swapper),内核一部分,系统进程
  1: init进程, 内核调用,负责内核启动后启动Linux系统
  没有终端限制
  让某个进程不因为用户、终端或者其他的变化而受到影响,那么就必须把这个进程变成一个守护进程

守护进程编程步骤
  1. 创建子进程,父进程退出
    •所有工作在子进程中进行
    •形式上脱离了控制终端
  2. 在子进程中创建新会话
    •setsid()函数
    •使子进程完全独立出来,脱离控制
  3. 改变当前目录为根目录
    •chdir()函数
    •防止占用可卸载的文件系统
    •也可以换成其它路径
  4. 重设文件权限掩码
    •umask()函数
    •防止继承的文件创建屏蔽字拒绝某些权限
    •增加守护进程灵活性
  5. 关闭文件描述符
    •继承的打开文件不会用到,浪费系统资源,无法卸载
    •getdtablesize()
    •返回所在进程的文件描述符表的项数,即该进程打开的文件数目

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>

int main() {
    pid_t pid;
    int i,fd;
    char *buf="This is a daemon program.\n";

    if ((pid=fork())<0) {
        printf("fork error!");
        exit(1);
    }else if (pid>0)  // fork且退出父进程
        exit(0);
    
    setsid();    // 在子进程中创建新会话。
    chdir("/");  // 设置工作目录为根
    umask(0);    // 设置权限掩码
    for(i=0;i<getdtablesize();i++)  //getdtablesize返回子进程文件描述符表的项数
        close(i);                // 关闭这些不将用到的文件描述符

    while(1) {// 死循环表征它将一直运行
// 以读写方式打开"/tmp/daemon.log",返回的文件描述符赋给fd
        if ((fd=open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) {
            printf("Open file error!\n");
            exit(1);
        }
        // 将buf写到fd中
        write(fd,buf,strlen(buf)+1);
        close(fd);
        sleep(10);
        printf("Never output!\n");
    }

    return 0;
}

因为stdout被关掉了,所以“Never ouput!”不会输出。


查看/tmp/daemon.log,说明该程序一直在运行


手把手保姆级|Python爬取微信公众号文章完整版,反反爬策略拉满,附可运行完整代码(永久可用) 做Python爬虫的朋友都知道,爬取微信公众号文章 绝对是爬虫领域的「香饽饽」也是「硬骨头」。一方面,微信公众号的文章是极具价值的数据源:不管是自媒体从业者做竞品分析、新媒体运营者整理干货、还是个人学习收集资料,都需要批量爬取公众号文章;另一方面,微信的反爬机制堪称全网最严苛之一 ——腾讯对微信生态的风控做到了极致,动态渲染页面、高频IP封禁、Cookie短时效失效、请求头严格校验、自动化工具秒识别、频繁请求直接拉黑,这些反爬手段让90%的爬虫新手望而却步:要么爬了几篇就被封IP,要么Cookie失效爬取中 阅读详情

相关推荐

Dynamics 365从入门到精通:一站式掌握微软智能商业应用平台

很多新手学Dynamics 365时,容易陷入“死记功能”的误区,其实这款平台的核心价值不是“功能多全”,而是“能适配企业业务流程,通过生态集成提升效率”。先从具体业务场景入手,理解每个功能的实际价值;再通过生态集成拓展系统能力;最后通过开发实现定制化,满足企业的特殊需求。按照这个思路,新手不用害怕复杂,一步步落地实战,3个月就能从“入门”到“能独立负责项目”。如果在学习过程中遇到具体问题(比如部署报错、数据迁移失败),欢迎在评论区留言,我会结合实战经验帮你解答!

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1045

linux小命令

Ls -a列出系统中的隐含文件,linux下的隐含文件是靠文件名的格式来表示的,不同于dos是靠文件属性来表示,即只要该文件以“.”开头,那么它就是隐含文件。 -l以长式列出。就是把该文件或目录的所有信息都列出来,一个文件占一行 相当于dos下的dir命令,是列文件列表的命令。 cd 和dos下的cd一样,转换目录的命令。 注意:linux下转到上级目录要打"cd .."而不...

weixin_34310369的博客 1303

【UE5】多用户协同编辑实战:从配置到实时协作

本文详细介绍了在虚幻引擎5中配置和使用多用户协同编辑功能的完整流程。从启用Multi-User Editing插件、配置UDP Messaging网络通信,到启动服务器、创建会话并实现实时协作,提供了从环境准备到实战协作的清晰指南。文章还分享了资产同步、场景分批、对象锁定等实用技巧,并强调了网络配置与版本一致性等关键避坑点,旨在帮助中小型团队提升关卡设计和原型开发的协作效率。

weixin_29001683的博客 269

linux内核之进程的基本概念(进程,进程组,会话关系)

进程是操作系统的一个核心概念。每个进程都有自己唯一的标识:进程ID,也有自己的生命周期。一个典型的进程的生命周期如图4-1所示。进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家族树。除此以外,进程还有其他层次关系:进程、进程组和会话。进程组和会话在进程之间形成了两级的层次:进程组是一组相关进程的集合,会话是一组相关进程组的集合。这样说来,一个进程会有如下ID:·PID:进程的...

weixin_30522095的博客 1324

字节开源 DeerFlow 2.0:从 Deep Research 到 Super Agent Harness 的进化之路

GitHub Trending 冠军项目,字节跳动完全开源的超级智能体框架。支持子代理、沙箱执行、长期记忆、技能扩展,可完成从几分钟到几小时的复杂任务。本文深度解析架构设计、安装实战、技能系统,并附上独家配置指南。

qq_38610923的博客 1716

Obsidian和Typora图片路径同步终极指南:告别混乱的assets文件夹

本文详细解析了Obsidian与Typora图片路径同步的终极解决方案,通过Custom Attachment Location插件实现动态路径管理,解决了两款工具间图片兼容性问题。文章提供了从基础配置到高级应用的完整指南,帮助用户告别混乱的assets文件夹,提升工作效率。

g9h0i1的博客 826

Linux基础概念--进程、子进程、进程组和会话

Linux基础概念--进程、子进程和进程组、会话

jinking01的专栏 3250

Coze平台智能体开发实战:打造测试工程师的AI助手

智能体是具备特定身份和能力的AI实体,由大语言模型(LLM)驱动,并通过插件、知识库和工作流扩展其能力。明确的角色定位:可以设定特定身份和专业领域扩展能力:通过插件连接外部工具和服务记忆能力:通过知识库存储和检索专属信息流程化处理:通过工作流执行复杂多步任务通过Coze平台创建测试工程师智能体,可以显著提升测试效率和质量。明确的角色定位:聚焦测试工程师的实际需求丰富的知识库:提供准确的领域知识支持合适的工具集成:通过插件连接现有工具链持续迭代优化:根据反馈不断改进智能体行为自动化测试生成。

hogwarts_beibei的博客 1005

linux 会话 进程组,Linux进程模型——会话和进程组

先放总结给没空看全文的人:session(会话)是用户登录系统以后所需的context(上下文)process group(进程组)是一组相关联的进程,用来方便信号量的分发session退出以后所有隶属于该session的进程组都会收到hup信号而挂起,这样就有了控制进程生命周期的作用tty可以作为输入输出设备被绑定到一个session上,bash就是这么干的子进程会继承父进程的session和p...

weixin_30336531的博客 434

Slow waitForAckedSeqno took 64873ms (threshold=30000ms). File being written

Slow waitForAckedSeqno took 64873ms (threshold=30000ms). File being written

zhengzaifeidelushang的博客 2011

RFC 字符码转换深度解析:Unicode、非 Unicode 与 MDMP 系统的协奏

老版本 MDMP 系统不上传自定义映射时,Unicode 端会落回“预配置列表”。列表里可见西欧 1100、日文 8000、中文 8400 等经典编号。若需强制覆写映射,可在 SM59 ➡Unicode页签启用,或直接勾选作为兜底。字符编码问题常“潜伏”多年,一旦旧系统升级或新增语种便集中爆发。掌握 RFC code page 转换机理、灵活运用 SM59 选项、在早期对 LANG 字段和字段长度进行治理,是根治乱码与 short dump 的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 227

Linux守护进程、进程组、会话

1、守护进程的特点 1)、后台服务进程 2)、独立于控制终端 3)、周期性执行某任务 4)、不受用户登录注销影响(关机肯定影响) 5)、一般采用以d结尾的名字(服务) 2、进程组 1)、进程的组长 组里边的第一个进程 进程组的id==进程组的组长的id 2)、进程组组长选用规则 进程中的第一个进程 3)、进程组的id的设定 进程组的id就是组长的进程id 3、会话 1)、创建一个会话注...

但行好事,莫问前程 459

金融领域强化学习在高频交易中的应用

强化学习(Reinforcement Learning,简称RL)是一种机器学习范式,通过智能体与环境的交互来学习策略,以最大化累计奖励。与监督学习和无监督学习不同,强化学习依赖于动态的反馈机制,智能体通过试错不断优化决策过程。高频交易(High-Frequency Trading,简称HFT)是指在极短时间内进行的大量金融交易,通常利用算法和计算机系统自动执行交易策略。高频交易依赖于高速的数据处理和决策能力,以捕捉市场中的微小价格波动。状态(State):环境在某一时刻的观测,反映了系统的当前情况。

AI天才研究院 895

Linux 终端、进程组、会话、守护进程

介绍总结 Linux 下 终端、进程组、会话、守护进程知识

weixin_45004203的博客 1406

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Linux】终端/进程组/会话/守护进程

一、终端        1、什么是终端?                     在 Linux 系统中,用户通过终端登录到系统后得到一个 shell 进程,这个终端成为 shell 进程的控制终端,进程中,控制终端是保存在 PCB 中的信息,而 fork 会复制  PCB 中的信息,因此右 shell 进程启动的其他进程的控制终端也是这个终端。在默认情况下(没有重定向),每个进程的标准输入

ARRAYLI_博客 1090

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux专题十一:终端,会话,进程组及守护进程

进程组是由一个或多个相关进程组成的逻辑集合,每个进程组有唯一的进程组 ID(PGID),进程组组长(老板)的 PID 等于该进程组的 PGID,进程组的生命周期与组长进程无关(只要组内有进程存在,进程组就存在)。核心特性与关键细节组长进程(核心)唯一标识:组长进程的PID = 进程组PGID,每个进程组必然有且仅有一个组长(创建时确定,生命周期内不变)。生命周期无关性:组长进程退出后,进程组依然存在(此时称为 “孤儿进程组”,系统会自动处理,避免产生僵尸进程),且PGID。

2501_90355051的博客 1211

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深入理解Linux系统:进程组、会话、作业、控制终端与守护进程的关系解析

本文探讨了进程组、会话、控制终端和作业的基本概念及其相互关系。首先,介绍了进程组的定义和作用,接着解释了会话、控制终端和作业的概念,并分析了它们之间的联系。文章最后讨论了守护进程的功能及其在系统中的重要性。通过对这些概念的系统性讲解,读者可以更清晰地理解进程管理的机制和各组件的协作方式。

无敌岩雀的博客 2107

linux终端、进程组、会话、守护进程

终端 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键...

铍镁钙锶钡镭 300

【Linux】守护进程与作业控制:进程组、会话与控制终端

本文深入探讨了守护进程的概念及其在 UNIX/Linux 系统中的重要性。守护进程作为后台运行的进程,承担着系统管理和资源监控的任务。首先介绍了进程组和会话的基本定义,阐明了它们在进程管理中的作用。接着,详细解释了控制终端的功能及其与会话的关系,以及如何通过作业控制实现对进程的管理和调度。此外,文章还讨论了中断信号和挂断信号的机制,帮助读者理解这些概念如何影响进程的运行状态。通过对这些基本概念的深入分析,读者将能够更好地掌握守护进程及其在操作系统中的应用。

卜及中的博客 1016

linux 会话 进程组,从进程组、会话、终端的概念深入理解Linux守护进程

一、写在前面「守护进程」是 Linux 的一种长期运行的后台服务进程,也有人称它为「精灵进程」。我们常见的 httpd、named、sshd 等服务都是以守护进程 Daemon 方式运行的,通常服务名称以字母d结尾,也就是 Daemon 第一个字母。与普通进程相比它大概有如下特点:无需控制终端(不需要与用户交互)在后台运行生命周期比较长,一般是随系统启动和关闭二、守护进程必要性为什么要设置为守护进...

weixin_36123285的博客 441

理解Linux进程,进程组,会话(nohup与守护进程)

进程 三种进程: 普通进程:默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作。 后台进程:对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&amp;amp;'实现这个目的。(切换到后台的进程称为job)(当连接终端的网络出现问题,那么也会导致运行程序中断) 守护进程:如果一个进程永远都是以后台方式启动,并且不能受到Shell退出影响而...

zhougb3的博客 862

Linux 终端-进程组-会话-守护进程

- 终端 1>ctrl+alt+(1-6)文字终端,7是图形终端 文字终端(bash)的启动流程 - 网络终端 - 进程组(作业) 1>进程组ID=第一个进程ID(组长ID) 2>kill -SIGKILL -进程组ID(负的) //杀死进程组内的全部进程 3>进程组生命周期:进程组创建到最后一个进程结束(注意:组长进程结束,该进程并不会结束) 4>进程组操作函数 #include<stdio.h> #include<unistd.h> #include<stdlib.h&

KHY666的博客 220

《Linux 进程管理进阶:会话、进程组与守护进程的底层逻辑与实践》

在 Linux 的世界里,进程并非孤立存在。当我们执行一条命令、启动一个服务时,这些进程会以会话(Session)为 “社交圈”、进程组(Process Group)为 “小团体” 的形式组织起来;而那些在后台默默运行、不受终端影响的守护进程(Daemon),更是 Linux 系统稳定运行的 “幕后英雄”!

月亮永悬不落,剑指巅峰 1582

深入理解 Linux 进程管理:进程组、会话、守护进程与关键系统调用

在 Linux 中,进程组是由一个父进程及其所有子进程组成的集合。每个进程组有一个唯一的进程组 ID(PGID),它通常与进程组长(组长进程,即父进程)的进程 ID(PID)相同。进程组为一组相关的进程提供了一个统一的管理单元。会话是多个进程组的集合,通常由一个用户登录后启动的所有进程组成。每个会话有一个唯一的会话 ID(SID),通常与会话首进程(例如,登录进程)的 PID 相同。会话的作用是方便管理和组织用户在登录期间启动的所有进程。控制终端是与会话关联的终端设备,用于输入输出。

2301_80067496的博客 1413

Linux学习总结(十五)进程组,会话,守护进程

进程组 进程组,也称之为作业,BSD于1980年前后向unix中增加的一个新特性,代表一个或多个进程的集合,每个进程都属于一个进程组,在waitpid函数和kill函数的参数中都曾使用导,操作系统设计的进程组的概念,是为了简化对多个进程的管理。 当父进程创建子进程的时候,默认子进程与父进程属于同一个进程组,进程组ID=第一个进程ID(组长进程),所以,组长进程ID等于其进程组ID 可以使用kill -SIGKILL -进程组ID(负的)来将整个进程组内的进程全部杀死。 组长进程可以创建一个进程组,创建该进程

bureau123的博客 269

Linux:守护进程(进程组、会话和守护进程)

守护进程(Daemon)是 Linux 系统中一种长期运行的后台进程,通常用于执行系统级别的任务或服务。理解守护进程涉及进程组、会话及其与其他进程的关系。本文将详细介绍这些概念及其在 Linux 中的应用。

2510_91653061的博客 496
上一篇: rlimit
下一篇: 散列表(哈希表)的定义
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值