2.31、守护进程(2)

news/2024/11/17 19:30:36/

2.31、守护进程(2)

  • 1.守护进程的创建步骤
  • 2.什么情况下子进程不会继承父进程的组ID
  • 3.哪些操作会导致子进程的组ID发生改变
  • 4.kill怎么杀掉守护进程的
  • 实现守护进程

1.守护进程的创建步骤

  • 执行一个 fork(),之后父进程退出,子进程继续执行。 使用子进程的目的是防止创建会话的进程为首进程,创建守护进程(daemon)时,通常需要让该进程摆脱与控制终端的关联,即让它成为一个无终端进程。首进程创建会话会导致新建会话的组id与之前存在的组id相同。
  • 子进程调用 setsid() 开启一个新会话。
  • 清除进程的 umask 以确保当守护进程创建文件和目录时拥有所需的权限。
  • 修改进程的当前工作目录,通常会改为根目录(/)
  • 关闭守护进程从其父进程继承而来的所有打开着的文件描述符。
  • 在关闭了文件描述符0、1、2之后,守护进程通常会打开/dev/null 并使用dup2() 使所有这些描述符指向这个设备。
  • 核心业务逻辑

2.什么情况下子进程不会继承父进程的组ID

  1. 当父进程使用setpgid()系统调用将自己加入到一个新的进程组中,而子进程在此之后被创建时,子进程不会继承父进程的PGID,而是创建一个新的进程组,并将自己作为该进程组的领导进程,PGIDPID相同。
  2. 当父进程在创建子进程之前调用了setsid()系统调用创建了一个新的会话,子进程也会在此之后创建一个新的会话,并成为该会话的领导进程,PGIDPID相同。
  3. 当父进程使用CLONE_NEWPIDCLONE_NEWUSERLinux特有的命名空间创建了一个新的进程隔离环境时,子进程不会继承父进程的PGID

3.哪些操作会导致子进程的组ID发生改变

  1. 调用setpgid()系统调用将子进程加入到一个新的进程组中,子进程的PGID将被设置为指定的PGID
  2. 在子进程中调用setpgid()系统调用将自己加入到一个新的进程组中,子进程的PGID将被设置为指定的PGID
  3. 在子进程中调用setsid()系统调用创建一个新的会话,子进程将成为该会话的领导进程,并且PGIDPID相同。
  4. 在子进程中调用exec()系统调用执行另一个程序,新程序的PGID可能与旧程序不同。

4.kill怎么杀掉守护进程的

  • Linux系统中,kill命令可以向指定进程发送信号。这个过程是通过进程ID(PID)来实现的,而不是通过控制终端。即使守护进程没有控制终端,它也有一个PID,其他进程可以使用这个PID向它发送信号,其中包括kill命令发送的信号。

实现守护进程

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <signal.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>void work()
{// 获取从1970到time_t tm = time(NULL);struct tm* loc = localtime(&tm);// char buf[1024];// sprintf(buf, "%d-%d-%d %d:%d:%d\n", 1900 + loc->tm_year, 1 + loc->tm_mon//     , loc->tm_mday, loc->tm_hour, loc->tm_min, loc->tm_sec);// printf("%s", buf);char* str = asctime(loc);// printf("%s\n", str);int fd = open("time.txt", O_CREAT | O_APPEND | O_RDWR, 0664);write(fd, str, strlen(str));}int main()
{// 创建子进程,让父进程结束掉pid_t proPid = fork();if (proPid > 0){return 0;}// 创建新的会话窗口pid_t sePid = setsid();// 使用umask// mode_t & ~umaskumask(022);// 重定向进程工作目录,但是我们用户没有根目录权限chdir("/home/nowcoder/");// 将标准输出重定向到/dev/null目录下int fd = open("/dev/null");dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);sup2(fd, STDERR_FILENO);// 设置信号捕捉struct sigaction act;act.sa_flags = 0;sigemptyset(&act.sa_mask);act.sa_handler = work;sigaction(SIGALRM, &act, NULL);// 从3秒之后每隔两秒发送SIGALAR信号struct itimerval val;val.it_value.tv_sec = 3;val.it_value.tv_usec = 0;val.it_interval.tv_sec = 2;val.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &val, NULL);while (1){sleep(2);}return 0;
}

http://www.ppmy.cn/news/41001.html

相关文章

LeetCode算法小抄--花式遍历二叉树

LeetCode算法小抄--花式遍历二叉树花式遍历二叉树翻转二叉树[226. 翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)填充节点的右侧指针[116. 填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/)将…

Betaflight BN880 GPS 简单测试

Betaflight BN880 GPS 简单测试1. 源由2. 窗台对比测试3. 开阔区域测试3.1 GPS安装位置3.1.1 BN880 GPS 机尾打印支架 安装位置3.1.2 BN880 GPS 机头固定 安装位置3.1.3 M8N GPS 机尾打印支架 安装位置3.2 M8N模块历史记录3.3 BN880模块第一次&#xff08;机尾安装&#xff09;…

混沌工程入门--SpringBoot 集成 ChaosMonkey

目录 1.首先引入依赖 2.修改配置文件,增加如下内容 3.启动项目,调用接口,可能会出现接口延迟或者500 3.1接口500示例 4.官方文档地址:Chaos Monkey for Spring Boot Reference Guide 1.首先引入依赖 <dependency><groupId>de.codecentric</groupId><a…

编写猫咪相册应用 HTML

文章目录1. 标题元素标签2. p元素用于在网站上创建一段文本3. 注释4. 页面主要部分标识标签5. 通过使用img元素来为你的网站添加图片6. 使用锚点元素(a)链接到另一个页面7. 使用 section 元素将照片内容与未来的内容分开8. 无序列表(ul)元素&#xff0c;列表项(li)元素在列表中…

Dream 主题之 Halo 2.0 适配,以及适配前后的一些异同

经过一段时间的适配&#xff0c;目前 Dream 已经发布了基于 Halo 2.x 的第一个预发版本。目前对主题所有功能都完成了适配&#xff0c;但是由于 Halo 2.x 与 1.x 的一些不同&#xff0c;以及 Thyeleaf 模板引擎与 FreeMaker 模板渲染引擎的一些不同的特性&#xff0c;适配前与适…

九【springboot】

Springboot一 Spring Boot是什么二 SpringBoot的特点1.独立运行的spring项目三 配置开发环境四 配置开发环境五 创建 Spring Boot 项目1.在 IntelliJ IDEA 欢迎页面左侧选择 Project &#xff0c;然后在右侧选择 New Project&#xff0c;如下图2.在新建工程界面左侧&#xff0c…

linux crontab 使用conda env 运行 python脚本 不生效 怎么解决

写了一个python脚本&#xff0c;想每天定时运行&#xff0c;但是任务一直没有开始&#xff0c;脚本里的都是绝对路径&#xff0c;命令行是能正常运行的&#xff0c;查阅各种资料一步步排查。 最初的crontab 定时任务命令是&#xff1a; # m h d mon w command 30 9 * * * pyt…

【设计模式之美 设计原则与思想:规范与重构】36 | 实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?

我们可以把函数的运行结果分为两类。一类是预期的结果&#xff0c;也就是函数在正常情况下输出的结果。一类是非预期的结果&#xff0c;也就是函数在异常&#xff08;或叫出错&#xff09;情况下输出的结果。比如&#xff0c;在上一节课中&#xff0c;获取本机名的函数&#xf…