29-Linux--守护进程

2024-06-22 02:12
文章标签 linux 进程 守护 29

本文主要是介绍29-Linux--守护进程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.基础概念

1.守护进程:精灵进程,在后台为用户提高服务,是一个生存周期长,通常独立于控制终端并且周期性的执行任务火处理事件发生

2.ps axj:查看守护进程

3.进程组:多个进程的集合,由于管理进程

4.组长进程:由于标识每个进程组,进程组的ID是组长进程的ID

5.getsid():获取会话ID

6.getpgrp():获取组长进程的ID

7.tail -f 文件名 :查看日志文件的写入变化

二.编程流程

1.调用fork(),产生子进程A,退出父进程

2.脱离控制终端,建立新的会话

 进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的 shell 登录终端。 控制终端、登录会话和进程组通常是从父进程继承下来的。 我们的目的就是要摆脱它们 ,使之不受它们的影响。因此需要调用 setsid() 使子进程成为新的会话组长

setsid() 调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 

3.fork()去掉子进程A的组长进程身份,禁止子进程A打开控制终端

现在,子进程A已经成为无终端的会话组长, 但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端,采用的方法是再次创建一个子进程B,

4.修改工作路径为根目录

5.清空掩码

进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取权限。为防止这一点,将文件创建掩模清除

6.关闭文件描述符

代码:

#include<stdio.h>      // 包含标准输入输出库
#include<stdlib.h>     // 包含标准库函数,如exit
#include<unistd.h>     // 包含Unix标准函数,如fork, setsid, sleep
#include<string.h>    // 包含字符串操作函数,如memset
#include<sys/stat.h>   // 包含文件状态相关函数,如umask
#include<fcntl.h>      // 包含文件控制选项,如open, close
#include<time.h>       // 包含时间函数,如time, asctime, localtimeint main()
{pid_t pid = fork(); // 创建一个新的进程if(pid != 0)       // 如果当前进程不是子进程(即父进程),则退出{exit(0);       // 退出父进程}setsid();          // 创建一个新的会话,该会话与终端脱离关联pid = fork();      // 再次创建一个新的进程if(pid != 0)      // 如果当前进程不是子进程(即上一个子进程的父进程),则退出{exit(0);       // 退出上一个子进程的父进程}chdir("/");        // 将当前工作目录更改为根目录"/"umask(0);          // 设置文件创建时的默认权限掩码为0,即不限制权限// 关闭所有打开的文件描述符for(int i=0; i<getdtablesize(); i++){close(i);     // 关闭文件描述符i}while(1)          // 无限循环{FILE* fp = fopen("/tmp/c2305d.log","a"); // 打开或创建日志文件以追加模式if(fp == NULL) // 如果文件打开失败{break;     // 退出循环}time_t tv;     // 定义时间变量time(&tv);     // 获取当前时间fprintf(fp,"time=%s",asctime(localtime(&tv))); // 将格式化的时间写入文件fclose(fp);    // 关闭文件sleep(3);      // 休眠3秒}
}

tail -f c2305d.log查看:

这篇关于29-Linux--守护进程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082999

相关文章

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux中的缓冲区和文件系统详解

《Linux中的缓冲区和文件系统详解》:本文主要介绍Linux中的缓冲区和文件系统方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、FILE结构1、fd2、缓冲区二、文件系统1、固态硬盘2、逻辑地址LBA(一)数据块 Data blocks(二)inode表

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重