013会话和守护进程

013_logback中的SyslogAppender 1. syslog协议很简单: syslog发送者发送一小段信息到syslog服务器。接收者一般称为"syslog守护进程"或"syslog服务器"。Logback能向远程syslog守护进程发送消息。实现办法是SyslogAppender。 2. 下面是SyslogAppender的属性 3. 记录事件在syslog里的严重程度是从记录事件的级别转换而来的。DEBUG级别转换为7, INFO是6, WRAN是4, ERROR是3。 4. 由于syslog请求的格式遵循相当严格的规则, 所以Sys 阅读详情

会话和守护进程

1. 进程组和会话概念

1.1 进程组

进程组概念:

进程组,也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在waitpid和kill函数的参数中都曾使用过。操作系统设计的进程组的概念,是为了简化对多个进程的管理

当父进程,创建子进程的时候,默认子进程与父进程属于同一个进程组。进程组ID = 第一个进程ID(组长进程)。所以,组长进程标识,其进程组ID = 其进程ID

kill 命令杀死整个进程组:
kill -9 -进程组ID    //杀死整个进程组内的进程全部杀死
进程组的生存期:

组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关。
进程组的生存期,进程组创建到最后一个进程离开(终止或转移到另一个进程组)
一个进程可以为自己或子进程设置进程组

1.2 会话

会话:

就是进程组的集合

在这里插入图片描述

创建会话:

创建一个会话需要注意以下6点:

  1. 调用进程不能是进程组组长,该进程变成新会话的首进程
  2. 该进程成为一个新进程组的组长进程
  3. 需要root权限 (Ubuntu不需要)
  4. 新会话丢弃原有的控制终端,该会话没有控制终端
  5. 如果该进程调用的是组长进程,则出错返回
  6. 建立新会话时,先调用fork,父进程终止,子进程调用setsid()
ps ajx 查看当前进程会话ID
ps ajx 查看系统中的进程
a:列出所有用户的进程
j:列出与作业控制相关的信息
x:显示 有控制终端的进程 和 没有控制终端的进程

注意:组长进程不能成为新会话的首进程,新会话的首进程必定回成为组长进程

getsid() 获取进程所属的会话ID
#include<sys/types.h>
#include<unistd.h>

pid_t getsid(pid_t pid);

返回值:
成功:返回调用进程的会话ID
失败:-1,设置errno

pid = 0:表示查看当前进程会话ID

setsid() 创建会话
#include<sys/types.h>
#include<unistd.h>

pid_t setsid(void);

返回值:
成功:返回调用进程的会话ID
失败:-1,设置errno

demo 创建会话
  1. fork 创建子进程,父进程退出
  2. 打印子进程信息
  3. setsid 创建会话
  4. 打印子进程信息
/* session.c */
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc, char * argv [ ])
{
	pid_t pid;


	if ((pid = fork()) < 0)
	{
		perror("fork error\n");
		exit(1);
	}
	else if(pid == 0)
	{
		printf("child process PID is %d\n", getpid());
		printf("Group ID of child is %d\n",getpgid(0));
		printf("Session ID of child is %d\n", getsid(0));

		sleep(10);
		setsid();	// 子进程非组长进程,故其成为新会话的首进程(组长进程)

		printf("changed:\n");

		printf("child process PID is %d\n", getpid());
		printf("Group ID of child is %d\n",getpgid(0));
		printf("Session ID of child is %d\n", getsid(0));

		sleep(20);
		exit(0);
	}

	return 0;
}

在这里插入图片描述

2. 守护进程

2.1 守护进程的概念

Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。
创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。

2.2 创建守护进程模型

  1. 创建子进程,父进程退出
       所有工作在子进程中进行形式上脱离了控制终端
  2. 在子进程中创建新会话
       setsid() 函数
       使子进程完全独立出来,脱离控制
  3. 根据需要,改变当前目录位置(防止目录被卸载)
       chdir() 函数
       防止占用可卸载的文件系统
       也可以换成其他路径
  4. 根据需要,重设文件权限掩码
       umask 函数
       防止继承的文件创建屏蔽字拒绝某些权限
       增加守护进程的灵活性
  5. 根据需要,关闭/重定向 文件描述符 // 123 或者重定向到 /dev/null
        继承的打开文件不会用到,浪费系统资源,无法卸载
  6. 开始执行守护进程核心工作守护进程退出处理程序模型

修改文件路径

man 2 chdir    //change working directory

#include<unistd.h>

int chdir(const char *path);

重设文件掩码

man 2 umask	// set file mode creation mask

#include<sys/types.h>
#include<sys/stat.h>

mode_t umask(mode_t mask); 	// 一直成功,返回原来mask

2.3 demo 守护进程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
#include<signal.h>
#include<fcntl.h>
#include<sys/stat.h>

void sys_error(const char * str)
{
	perror(str);
	exit(1);
}

int main(int argc, char * argv [ ])
{
	pid_t pid;
	int ret,fd;

	pid = fork();
	if(pid > 0)
	{
		exit(0);	// 父进程终止
	}

	pid = setsid();	//创建新会话
	if (pid == -1)
		sys_error("setsid error\n");

	ret = chdir("/home/libai");		// 改变工作目录位置
	if(ret == -1)
		sys_error("chdir error\n");

	umask(0022);			// 改变文件访问权限掩码

	close(STDIN_FILENO);	// 关闭文件描述符0
	fd = open("/dev/null" , O_RDWR);	// fd-->/dev/null
	if(fd == -1)
		sys_error("open error\n");

	dup2(fd, STDOUT_FILENO);	// 重定向 stdout 和 stderr
	dup2(fd, STDERR_FILENO);

	while(1);		// 模拟守护进程逻辑
	

	return 0;
}

在这里插入图片描述
在这里插入图片描述

Intouch间接变量(扩展) 间接变量只是Intouch提供给开发者的便捷方式之一,并不是所有情况都一定要使用间接变量,有时候用条件语句或者内存变量的方式也能起到类似的作用。 阅读详情

相关推荐

嵌入式100题(013):孤儿进程、僵尸进程、守护进程的概念

孤儿进程、僵尸进程、守护进程的概念 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。 守护进程守护进程就是在后台运行,不任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,它们以root用户或者其他特

SWK_dy的博客 476

会话守护进程

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

StudyWinter的博客 394

商品标签识别系统:基于YOLO系列的深度学习实现

随着零售行业的快速发展自动化需求的增长,商品标签识别技术变得越来越重要。本文详细介绍了一个完整的商品标签识别系统,该系统基于YOLO系列目标检测算法(包括YOLOv5、YOLOv8YOLOv10),采用PySide6构建用户界面,并提供完整的训练代码数据集处理方案。该系统能够准确识别商品标签中的关键信息,如价格、条形码、生产日期等,为零售自动化、库存管理智能结算提供技术支持。

YOLO 324

Linux之获取主机信息

Linux 提供了相关API 用于获取系统主机相关信息 获取网络名称:int gethostname(char*name,size_t len) 参数 char*name:获取到的网络名字会写入name字符串中 size_t len:该字符串至少有len 个长度 返回值: 成功时返回0,失败时返回-1 AME gethostname, sethostname - ge...

zdg_c的博客 1078

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

进程组   一个或多个进程的集合   进程组ID: 正整数   两个函数   getpgid(0)=getpgrp() eg:显示子进程父进程的进程组id 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 int main() { 6...

weixin_30437337的博客 182

进程、进程组、会话以及守护进程

1.进程、进程组会话关系及其特性。 (1)  每个进程都有一个进程ID唯一识别(pid_t pid=getpid()); (2) 每个进程都属于一个进程组(getpgrp()),进程组属于一个会话(getsid(getpid())),是子集关系,即包含被包含。 (3) 进程组通常同一作业相关联,接收同一终端的各种信号。进程组有唯一的进程组ID(类型进程ID相同),可以有组长进程(进程

Linux学习笔记 3608

daemon(守护进程)

Daemon   Daemon程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不前台交互,Daemon程序一般作为系统服务使用。Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序它通信。我们也把运行的Daem

沧海一粟的专栏 3万+

005 软件定时器 013

定时器类似于闹钟,需要设置一个闹钟的倒计时时间,一旦到了这个时间那么闹钟就会触发响铃的动作。定时器也是这样的,不过他的动作是由回调函数来作用的。FreeRTOS的定时器有两种:单次自动重载。单次定时器启动之后,定时时间一到调用回调函数执行动作,但这是一次性的,这个定时时间结束以后这个定时器就失效了,不会自动重新启动,但可以手动重新启动。自动重载计时器启动之后,自动重载计时器将在每次到期时重新更新计时器值,从而重新启用这个定时器,这样就会定期调用其回调函数触发动作。

APP_xinyonghu_li的博客 1192

重学计算机(十二、守护进程

时隔多年,每次碰到守护进程就想起当年,当年在大学学linux的时候,需要做个大作业,然后老师给了好多个题目,翻来翻去,发现就这个守护进程最简单,那就选守护进程吧。 选了守护进程的题目之后,发现还是不会做(哎,当年就没想过做linux相关的,真是人算不如天算)。不会做怎么办呢?那就找同学借鉴了(说是借鉴其实就是抄),然后就找到了叶某人的抄了过来,好像当时是完全抄过来的,因为当年确实对守护进程很懵逼。抄完了,那就交作业了。

酱油师兄的博客 1016

守护进程 daemon

Daemon   Daemon程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不前台交互,Daemon程序一般作为系统服务使用。Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序它通信。我们也把运行的Daemo

yuer的博客 569

macOS install redis遇到的bug(tar包,homebrew安装,守护进程redis.conf配置)

安装路径一般在 /usr/local/Cellar/redis/{version}或者/opt/homebrew/Cellar/redis/7.0.12/bin/里有redis-server。莫名其妙,但还是试着去安装了python tcl tk的包,useles,但看到有人说出现这个也不影响,之后确实可以make install。因为前端启动的redis server会在每次terminal或者ctrl c关闭后,就停止,我们采用守护进程就是希望可以后端持续运行,但是。发现没有conf文件,接着打开。

Dorothy603的博客 1437

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

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

ARRAYLI_博客 1084

守护进程会话

创建一个会话: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> int main(){ pid_t pid; if((pid=fork())<0){ perror("fork error"); exit(1);...

xiami 303

linux进程组、会话守护进程

进程组会话的关系图 进程组 显示进程组 函数介绍 #include pid_t getpgrp(void); 功能:返回进程组ID pid_t getpgid(pid_t pid); 功能:返回pid的进程组ID 显示子进程父进程的进程组ID #include #include #include int main() { pid

realize 1192

终端、进程组、会话守护进程(包括创建守护进程)详解

终端 输出设备输入设备的总称为终端。Unix中的terminal是伪终端,输入输出都流经这个terminal。Unix系统中,用户通过终端登录系统后得到一个shell进程,这个终端成为shell进程的控制终端。默认情况下(没有重定向),每个进程的标准输入,标准输出标准错误输出都指向控制终端。 网络终端 向XShell这样的连接到远程Unix系统的软件成为网络终端,网络终端工作流程如下图。tt...

IT_10的博客 581

Linux】 阶段性复习(linux vim gcc makefile gdb)

Linux命令工具速查摘要 本文整理了Linux常用命令开发工具的核心用法,分为以下四部分: 1. Linux常用命令分类 目录导航:pwd/ls/cd/mkdir/rmdir 文件操作:touch/rm/cp/mv 内容查看:cat/more/less/head/tail 搜索查找:find/grep/which/whereis 压缩传输:zip/unzip/rz/sz/tar 系统信息:date/cal/bc/uname 帮助热键:man/alias/Tab补全/Ctrl+c终止 2. Vim核心

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 798

Linux编程-进程的执行退出

fork()会;单纯 fork 出来的子进程,代码、数据父进程完全相同,只能执行父进程现存代码。exec。

2401_82879595的博客 224

安消防主机调试软件.zip

安消防主机调试软件可对 3006 3016 3032 等等 还要系列壁挂机调试调试使用打印机线 安装驱动就可以正常调试 (内附驱动)

上一篇: 012信号_定时器设定_信号集设定_信号捕捉
下一篇: 014Linux线程及线程控制相关函数
小峰没有疯
博客等级 码龄4年 5粉丝 17原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值