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

DSP 6678处理器Cache配置实战:从基础设置到多核一致性优化 本文深入探讨了TI TMS320C6678多核DSP处理器的Cache配置与优化实战。文章从基础概念入手,详细解析了L1、L2 Cache的模式选择与内存属性配置,并重点剖析了多核环境下缺乏硬件一致性支持带来的挑战。核心部分提供了基于Writeback和Invalidate操作的手动一致性维护策略,以及针对数据流处理、频繁访问共享数据等不同场景的性能调优与避坑指南,帮助开发者构建高效稳定的多核DSP系统。 阅读详情
原文:http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html
进程组
  一个或多个进程的集合
  进程组ID: 正整数
  两个函数
  getpgid(0)=getpgrp()

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

复制代码
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4
5 int main() {
6 pid_t pid;
7
8 if ((pid=fork())<0) {
9 printf("fork error!");
10 }else if (pid==0) {
11 printf("The child process PID is %d.\n",getpid());
12 printf("The Group ID is %d.\n",getpgrp());
13 printf("The Group ID is %d.\n",getpgid(0));
14 printf("The Group ID is %d.\n",getpgid(getpid()));
15 exit(0);
16 }
17
18 sleep(3);
19 printf("The parent process PID is %d.\n",getpid());
20 printf("The Group ID is %d.\n",getpgrp());
21
22 return 0;
23 }
复制代码

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

 

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

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

复制代码
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4
5 int main() {
6 pid_t pid;
7
8 if ((pid=fork())<0) {
9 printf("fork error!");
10 exit(1);
11 }else if (pid==0) {
12 printf("The child process PID is %d.\n",getpid());
13 printf("The Group ID of child is %d.\n",getpgid(0)); // 返回组id
14 sleep(5);
15 printf("The Group ID of child is changed to %d.\n",getpgid(0));
16 exit(0);
17 }
18
19 sleep(1);
20 setpgid(pid,pid); // 改变子进程的组id为子进程本身
21
22 sleep(5);
23 printf("The parent process PID is %d.\n",getpid());
24 printf("The parent of parent process PID is %d.\n",getppid());
25 printf("The Group ID of parent is %d.\n",getpgid(0));
26 setpgid(getpid(),getppid()); // 改变父进程的组id为父进程的父进程
27 printf("The Group ID of parent is changed to %d.\n",getpgid(0));
28
29 return 0;
30 }
复制代码

 

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

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

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

复制代码
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4
5 int main() {
6 pid_t pid;
7
8 if ((pid=fork())<0) {
9 printf("fork error!");
10 exit(1);
11 }else if (pid==0) {
12 printf("The child process PID is %d.\n",getpid());
13 printf("The Group ID of child is %d.\n",getpgid(0));
14 printf("The Session ID of child is %d.\n",getsid(0));
15 sleep(10);
16 setsid(); // 子进程非组长进程,故其成为新会话首进程,且成为组长进程。该进程组id即为会话进程
17 printf("Changed:\n");
18 printf("The child process PID is %d.\n",getpid());
19 printf("The Group ID of child is %d.\n",getpgid(0));
20 printf("The Session ID of child is %d.\n",getsid(0));
21 sleep(20);
22 exit(0);
23 }
24
25 return 0;
26 }
复制代码

 

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

 

 

守护进程
  Linux大多数服务都是通过守护进程实现的,完成许多系统任务
  0: 调度进程,称为交换进程(swapper),内核一部分,系统进程
  1: init进程, 内核调用,负责内核启动后启动Linux系统
  没有终端限制
  让某个进程不因为用户、终端或者其他的变化而受到影响,那么就必须把这个进程变成一个守护进程
 
守护进程编程步骤
  1. 创建子进程,父进程退出
    •所有工作在子进程中进行
    •形式上脱离了控制终端
  2. 在子进程中创建新会话
    •setsid()函数
    •使子进程完全独立出来,脱离控制
  3. 改变当前目录为根目录
    •chdir()函数
    •防止占用可卸载的文件系统
    •也可以换成其它路径
  4. 重设文件权限掩码
    •umask()函数
    •防止继承的文件创建屏蔽字拒绝某些权限
    •增加守护进程灵活性
  5. 关闭文件描述符
    •继承的打开文件不会用到,浪费系统资源,无法卸载
    •getdtablesize()
    •返回所在进程的文件描述符表的项数,即该进程打开的文件数目

复制代码
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <sys/wait.h>
6 #include <sys/types.h>
7 #include <fcntl.h>
8
9 int main() {
10 pid_t pid;
11 int i,fd;
12 char *buf="This is a daemon program.\n";
13
14 if ((pid=fork())<0) {
15 printf("fork error!");
16 exit(1);
17 }else if (pid>0) // fork且退出父进程
18 exit(0);
19
20 setsid(); // 在子进程中创建新会话。
21 chdir("/"); // 设置工作目录为根
22 umask(0); // 设置权限掩码
23 for(i=0;i<getdtablesize();i++) //getdtablesize返回子进程文件描述符表的项数
24 close(i); // 关闭这些不将用到的文件描述符
25
26 while(1) {// 死循环表征它将一直运行
27 // 以读写方式打开"/tmp/daemon.log",返回的文件描述符赋给fd
28 if ((fd=open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) {
29 printf("Open file error!\n");
30 exit(1);
31 }
32 // 将buf写到fd中
33 write(fd,buf,strlen(buf)+1);
34 close(fd);
35 sleep(10);
36 printf("Never output!\n");
37 }
38
39 return 0;
40 }
复制代码

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

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


非sudo用户如何安全使用Docker:Rootless模式实战指南 Docker Rootless模式是一种基于Linux用户命名空间(userns)的容器运行时安全机制,它通过UID/GID映射、fuse-overlayfs文件系统和slirp4netns网络栈,在不提升权限的前提下实现容器隔离。其核心原理是将容器内root身份映射为宿主机非特权用户,从而规避docker组等价root的安全风险。相比传统root模式,Rootless在权限控制、逃逸防护和多租户隔离方面具备天然优势,适用于CI/CD流水线、Kubernetes边缘节点及受限生产环境。本文聚焦无sudo权限 阅读详情

相关推荐

北京联通IPTV组播实战:OpenWRT软路由配置全解析

本文详细解析了在北京联通IPTV环境下,利用OpenWRT软路由和udpxy工具实现组播转单播的实战配置。内容涵盖网络接口设置、防火墙规则、udpxy安装配置、直播源M3U文件处理以及全平台播放指南,帮助用户无需机顶盒即可在家庭局域网内任何设备上流畅观看电视直播。

weixin_29313547的博客 1405

linux小命令

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

weixin_34310369的博客 1301

CTP开发实战:如何高效处理预埋单与委托单的完整流程(附代码示例)

本文深入探讨了CTP开发中预埋单与委托单的完整处理流程,从订单生命周期理解、核心代码实现到异步事件处理与系统健壮性构建。通过详细的代码示例和状态机分析,为开发者提供了构建高可靠订单处理系统的实战指南,重点解决了状态同步、异常恢复等关键工程挑战。

weixin_29234239的博客 116

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

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

weixin_30522095的博客 1324

告别重启烦恼:用WSL2让Docker和VMware在Win10上真正共存

本文详细介绍了如何在Windows 10系统上,借助WSL2实现Docker与VMware的真正共存,彻底告别以往需要反复重启切换的烦恼。通过启用Hyper-V兼容模式并进行正确配置,开发者无需重启即可同时高效运行容器和虚拟机,显著提升开发与测试工作流的连续性和效率。

salt9的博客 987

混合部署 操作系统混合部署

在openEuler Embedded 22.03中,已经集成了OpenAMP相关支持,并与openEuler的SIG Zephyr合作实现了openEuler Embedded与实时操作系统Zephyr在QEMU平台上的混合部署。具体的混合部署方式取决于设备的硬件和软件支持。例如,可以使用虚拟机软件(如VirtualBox)在Linux操作系统上运行Android虚拟机,从而实现Linux和Android的混合部署。需要注意的是,混合部署涉及到设备的硬件和软件兼容性,以及操作系统的配置和管理。

dianqicyuyan的博客 1763

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

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

jinking01的专栏 3248

嵌入式设备系统日志记录及调试技巧_嵌入式日志系统(1),如何成为杰出的程序员

这里面我使用的芯片为哈弗体系,全局常量存储编译器默认分配在flash,需要注意如果使用片内flash时,注意存储调试等级的flash块不要与代码区重合,要不然修改调试等级擦除flash块同时PC指针指向当前块的代码区,会导致仪器死机;这个也是之前用的比较多的,以上代码是模仿linux 内核的写法,可以比较好的做到日志信息分层,编译时相加对应的编译开关即可。但有个弊端就是,切换debug等级时,需要重新编译且需更新固件,而嵌入式设备出现异常后更新固件往往复位后,故障有时很难复现,调试起来比较浪费时间。

2401_84240431的博客 1292

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

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

weixin_30336531的博客 434

零基础玩转华为AP 4050DN-HD:FAT模式家庭无线网络配置实战

本文为零基础用户提供华为AP 4050DN-HD从FIT模式转换为FAT模式的完整实战教程。详细介绍了固件升级、模式转换以及配置家庭无线网络(包括路由、DHCP、Wi-Fi和NAT)的每一步操作,帮助用户将企业级瘦AP改造为高性能家庭胖AP,打造稳定可靠的家庭网络环境。

weixin_29196613的博客 628

【AI大模型】角色设定:给模型定身份的高效使用方法

摘要: AI大模型角色设定(RolePrompting)是提示词工程的核心优化技巧,通过赋予模型特定职业、领域和风格约束,显著提升输出专业度与适配性。文章系统拆解了角色设定的原理、万能公式(领域+身份+技能+风格+场景)、三级分层写法(基础/进阶/专家),并提供10类高频场景的模板。通过无角色与有角色输出的对比实验(Python代码量化验证),证明角色设定可使模型综合得分提升35%以上,尤其优化场景适配度与风格统一性。该技巧作为高阶提示词(如CoT、Few-Shot)的前置模块,能以零成本实现AI输出的专业

unber的博客 41

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

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

但行好事,莫问前程 459

手把手教你学simulink实例--基于Simulink的船舶动力定位系统建模与仿真

船舶动力定位系统(Dynamic Positioning System, DPS)是一种通过控制推进器来保持船舶在指定位置和航向的技术。它广泛应用于海上钻井平台、海洋调查船、起重船等需要精确位置控制的场景。DPS的核心任务是实时感知环境干扰(如风、浪、流),并通过闭环控制算法调整推进器输出,以抵消外界扰动并维持船舶的位置和姿态。本项目旨在基于MATLAB/Simulink平台,构建船舶动力定位系统的数学模型,并进行仿真分析,验证其性能和稳定性。

MHD0815的博客 1082

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

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

weixin_45004203的博客 1406

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

ARRAYLI_博客 1090

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

2501_90355051的博客 1208

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

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

铍镁钙锶钡镭 300

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

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

无敌岩雀的博客 2104

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

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

卜及中的博客 1016

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

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

weixin_36123285的博客 441

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

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

zhougb3的博客 861

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

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

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

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

2301_80067496的博客 1412

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

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

bureau123的博客 268

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

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

2510_91653061的博客 495

【Linux】守护进程(附终端、进程组、会话的介绍)

主要介绍了守护进程

mhyasadj的博客 818
上一篇: 我的找工作心酸奇葩史
下一篇: python dist-packages 和 site-packages
ECHOutopia
博客等级 码龄14年 11粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值