【项目 进程14】2.30 守护进程(1) 2.31 守护进程(2)

news2024/11/26 9:50:14

文章目录

    • 2.30 守护进程(1)
    • 终端
    • 进程组
    • 会话
    • 进程组、会话、控制终端之间的关系
    • 进程组、会话操作函数
    • 守护进程
    • 2.31 守护进程(2)
    • 守护进程的创建步骤
    • 写一个守护进程,每隔2s获取一下系统时间,将这个时间写入到磁盘文件中


2.30 守护进程(1)

终端

echo $$//查看当前终端的的pid
tty//查看当前终端设备

控制终端可以操作某一个进程。

在这里插入图片描述所以如果是一个后台进程,是没有控制终端的。是不能通过终端给进程发送信号的

进程组

在这里插入图片描述

会话

在这里插入图片描述

进程组、会话、控制终端之间的关系

在这里插入图片描述
find/2 查看2 重定向到 dev/null设备上,|管道(创建子进程),wc -l统计 &在后台运行,为一个新的进程组
PGID为进程组ID(G:group),SID为会话ID
执行一个命令,默认是在前台执行,除非加上&号。同一时刻,只能有一个前台进程组,只有前台进程组才能享有控制终端的操作权力。
在这里插入图片描述控制终端默认是后端进程。一打开这个终端,就创建了一个进程。于是会话组号和进程组号就定下来了。在这个进程下执行其他命令相当于是终端的子进程。在子进程中再创建子进程,就变成进程组。wx和uniq的ppid都是400是因为他们都是用execlp函数直接调用了其他进程来取代子进程。这些命令的父进程都是控制终端400

进程组、会话操作函数

在这里插入图片描述
getpgrp:get process group 获得当前进程组id
getpgid:获得指定进程的进程组id
setpgid:把哪个进程设置进哪个进程组
getsid:获取某个进程的会话id
setsid:设置会话id

守护进程

在这里插入图片描述

2.31 守护进程(2)

守护进程的创建步骤

在这里插入图片描述
若当前进程创建会话,当前进程产生进程组,进程组的组长不能和会话组长为同一进程。创建会话的进程不能为进程的组长,不能为进程的首进程
父进程死后会有shell提示符,如下:
在这里插入图片描述

(1)执行一个fork(),之后父进程退出,子进程继续后台执行的原因:防止父进程在被杀死时产生shell提示符。且确保子进程不会成为进程组的首进程。
(2)子进程调用setsid()开启一个新会话,原因:(很模糊)
id 100的进程调用setid()去开启一个会话,会执行下面两个步骤:
100的进程放在一个进程组中,进程组id为100,100也为会话的id。原先进程100所在的会话id为80,现在新创建出一个会话。新创建出来的会话只要和控制终端没有建立连接,那么就没有控制终端。目的:脱离控制终端(为什么调用setsid()?)。
为什么在子进程中调用?
若父进程id为100,进程组id为100。id100创建一个新会话,新会话中有进程组id100,进程id100,与原先会话冲突。若使用子进程id101创建新会话,则新会话中的进程组id为101,进程id为101,不会产生冲突

守护进程是后台(不受控制终端控制)服务(长期)进程。

写一个守护进程,每隔2s获取一下系统时间,将这个时间写入到磁盘文件中

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

void work(int num) {
    // 捕捉到信号之后,获取系统时间,写入磁盘文件
    time_t tm = time(NULL);
    //将time_t类型时间转换为本地时间
    struct tm * loc = localtime(&tm);
    // char buf[1024];

    // sprintf(buf, "%d-%d-%d %d:%d:%d\n",loc->tm_year,loc->tm_mon
    // ,loc->tm_mday, loc->tm_hour, loc->tm_min, loc->tm_sec);
	//脱离控制终端,这种方式不输出,且使用while循环,不让设置完定时器后程序即结束
    // printf("%s\n", buf);

	//asctime()系统调用
    char * str = asctime(loc);
    int fd = open("time.txt", O_RDWR | O_CREAT | O_APPEND, 0664);
    write(fd ,str, strlen(str));
    close(fd);
}

int main() {

    // 1.创建子进程
    pid_t pid = fork();

    //退出父进程
    if(pid > 0) {
        exit(0);
    }

    // 2.将子进程重新创建一个会话
    setsid();

    // 3.设置掩码
    umask(022);

    // 4.更改工作目录为跟目录:
    //守护进程会在系统启动的时候被创建并一直运行直至系统被关闭。
    //如工作目录为U盘,那么U盘一直不能卸载系统文件,而跟目录一直不会卸载工作目录
    
    chdir("/home/nowcoder/");

    // 5. 关闭、重定向文件描述符
    //重定向:后台程序不往终端输出信息
    int fd = open("/dev/null", O_RDWR);
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);

    // 6.业务逻辑

    // 捕捉定时信号
    struct sigaction act;
    act.sa_flags = 0;
    act.sa_handler = work;//函数指针
    sigemptyset(&act.sa_mask);
    sigaction(SIGALRM, &act, NULL);

    struct itimerval val;
    val.it_value.tv_sec = 2;
    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(10);
    }

    return 0;
}

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

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

相关文章

【枚举+trie+dfs】CF514 C

Problem - 514C - Codeforces 题意&#xff1a; 思路&#xff1a; 其实是trie上dfs的板题 先把字符串插入到字典树中 对于每次询问&#xff0c;都去字典树上dfs 注意到字符集只有3&#xff0c;因此如果发现有不同的字符&#xff0c;去枚举新的字符 Code&#xff1a; #in…

会用这个医疗小技巧,升职加薪不加班!

在医药领域&#xff0c;温湿度监控是确保药品质量和安全性的重要环节。药品的生产、存储、运输和展示过程中&#xff0c;温湿度变化可能对药品的有效性产生不良影响&#xff0c;因此需要实时监测和管理环境条件。 通过有效的温湿度监控系统&#xff0c;医药企业和医疗机构能够确…

docker系列--解决hyper-v导致docker无法启动问题

一、问题 windows docker desktop 启动报错异常&#xff0c;导致docker无法启动成功 我们看到问题出在hyper-v的问题上&#xff0c;搜索解决方法&#xff0c;官网常见问题如下 Overview | Docker Documentation 二、解决 Hyper-V 已安装并正常工作 在BIOS中启用虚拟化 Wind…

mapstruct 错误 java.lang.NoSuchMethodError: Ljava/lang/Double 错误

问题描述 在使用 mapstruct 的过程中遇到错误 java.lang.NoSuchMethodError: Ljava/lang/Double 错误 问题解决 maven clean, 然后 maven install Build -> Rebuild Project 执行 maven install 时, 如果报错 找不到 xxx 类, 但 ctrl鼠标左键 发现可以点进去这个类, 那…

[openCV]基于赛道追踪的智能车巡线方案V1

import cv2 as cv import os import numpy as npimport time# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表""&quo…

【Axure 教程】动态面板

【动态面板】是 Axure 中另外一个神级的元件&#xff0c;它的江湖地位可以说跟【中继器】不相上下&#xff0c;【动态面板】提供了简单的配置&#xff0c;却可以实现非常丰富的效果&#xff0c;在实际设计中应用非常广泛。 对于刚入门的产品经理来说&#xff0c;学习【动态面板…

02 持久层 - 客制化

文章目录 OverView[0] Provision[1] New Package[2] Create Table[3] Insert MockData[4] Check Data OverView 创建 ABAP Package客制化底表向底表写入测试数据查看测试数据 [0] Provision 没有创建 BTP Trail User Account 的需先申请账号&#xff0c;并通过 Eclipse 连接到…

「2024」预备研究生mem- 等差数列与列项相消Sn的最值奇数项与偶数项

一、等差数列与列项相消 二、Sn的最值 三、奇数项与偶数项 方法二&#xff1a;

一文学透设计模式——工厂模式

工厂模式 概念 牛马人生公司最近开启了线上直播&#xff0c;直播中牛马人生公司宣称他们建造了一家世界上最为先进的工厂&#xff0c;任何人只要去到工厂面前&#xff0c;告诉工厂你要什么牌子的汽车&#xff0c;工厂就会给你一辆什么牌子的汽车。 这引起了粉丝朋友的注意&a…

App Cleaner Uninstaller for Mac 苹果电脑软件卸载工具

App Cleaner & Uninstaller 是一款非常有用的 Mac 应用程序清理和卸载工具。它可以彻底地清理系统中的应用程序、扩展和残留文件&#xff0c;以释放磁盘空间并优化系统性能。 此外&#xff0c;它还提供了磁盘空间监控和智能清理建议等功能&#xff0c;使用户可以轻松地管理…

Java自定义校验注解实现List、set集合字段唯一性校验

文章目录 一&#xff1a; 使用场景二&#xff1a; 定义FieldUniqueValid注解2.1 FieldUniqueValid2.2 注解说明2.3 Constraint 注解介绍2.4 FieldUniqueValid注解使用 三&#xff1a;自定义FieldUniqueValidator校验类3.1 实现ConstraintValidator3.2 重写initialize方法3.3 重…

解决mvn clean install遇到testng单元测试失败时打包也失败的问题

解决mvn clean install遇到testng单元测试失败时打包也失败的问题 看这个之前请先看这个 Jenkins执行Testng 比如我现在就有一个单元测试失败的项目 执行mvn clean install的时候就会报错 下面是我现在的pom.xml 但我们不希望这样&#xff0c;怎么办 <plugin><gr…

【Vs Code】如何配置保存cpolar所建立的隧道参数?

文章目录 &#x1f4cb; 前言1.如何配置保存cpolar所建立的隧道参数&#xff1f;2.本地安装 VS Code并修改隧道参数2.1 Visual studio Code 下载2.2 配置Visual studio Code 相关参数2.3 编辑 cpolar.yml 隧道参数文件2.3 修改website隧道参数 3. 检查 cpolar.yml 文件配置是否…

2023年 Java 面试八股文(20w字)

目录 第一章-Java基础篇 1、你是怎样理解OOP面向对象 难度系数&#xff1a;⭐ 2、重载与重写区别 难度系数&#xff1a;⭐ 3、接口与抽象类的区别 难度系数&#xff1a;⭐ 4、深拷贝与浅拷贝的理解 难度系数&#xff1a;⭐ 5、sleep和wait区别 难度系数&a…

苹果提交审核出现“您的 App 包含 NSUserTrackingUsageDescription...”解决办法

您的 App 包含 NSUserTrackingUsageDescription&#xff0c;这表示您将会请求追踪用户。要在 App 产品页上更新此信息&#xff0c;您必须注明哪些数据类型会追踪用户。如果此描述有误&#xff0c;请更新您的 App 二进制文件&#xff0c;并将新的构建版本上传到 App Store Conne…

飞凌嵌入式「国产」平台大盘点(一)瑞芯微系列

“国产化”一词正在被越来越多的提及&#xff0c;有着越来越高的关注度&#xff0c;飞凌嵌入式也已与多家国内芯片原厂联合推出了数款国产化智能平台。为了帮助大家快速认识飞凌嵌入式推出的各系列国产核心板产品&#xff0c;小编将以芯片品牌进行分类带大家一起盘点。 本篇文…

注释//TODO的作用

// TODO用来标记某处&#xff0c;表示该处含有待办事项&#xff08;尚未解决&#xff09;。其设计本意只是提醒开发者注意&#xff0c;除了代码高亮之外&#xff0c;还可以借助编辑器实现快速定位。 如何使用 直接在 双斜杠后面加 TODO 或者 todo 即可&#xff0c;大小写不敏感…

加拿大量子研究新动作!D-Wave与滑铁卢大学合作研究量子相干性

​ &#xff08;图片来源&#xff1a;网络&#xff09; D-Wave是量子计算系统、软件和服务的领导者&#xff0c;也是量子计算机的第一家供应商。近期&#xff0c;D-Wave宣布与滑铁卢大学量子计算研究所&#xff08;IQC&#xff09;达成两项新合作。他们为量子计算系统建立了关键…

【Spring Cloud 五】OpenFeign负载均衡

这里写目录标题 系列文章目录背景一、OpenFeign是什么Feign是什么Feign的局限性 OpenFeign是什么 二、为什么要有OpenFeign三、如何使用OpenFeign服务提供者order-servicepom文件yml配置文件启动类实体ParamController 服务消费者user-servicepom文件yml配置文件启动类接口类Us…

嵌入式该往哪个方向发展?

1. 你所在的城市嵌入式Linux岗位多吗&#xff1f;我觉得这是影响你做决定的另一个大问题。我们学嵌入式Linux这门技术&#xff0c;绝大部分人是为了从事相关的工作&#xff0c;而不是陶冶情操。但是根据火哥统计来看&#xff0c;嵌入式Linux的普遍薪资虽然高于单片机&#xff0…