IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 守护进程及相关概念 -> 正文阅读

[系统运维]守护进程及相关概念

目录

进程

会话

操作函数:

守护进程(Daemon进程)


进程

进程组和会话形成两级层次关系:进程组是一组相关进程的集合,会话是一组相关进程组的集合。

一个进程组拥有一个进程组首进程,该进程id为该进程组id,新进程会继承其父进程所属进程组id。

进程组的生命周期是首进程创建组的时刻-最后一个进程退出时刻。进程可能会因为终止/加入另一个进程组而退出该组。

会话

会话首进程是创建该会话的进程,其进程id为会话id,新进程继承其父进程会话id.

一个会话的所有进程共享一个控制终端,一个终端只能是一个会话的控制终端,控制终端在会话首进程首次打开终端设备时建立。

任一时刻,会话里的一个进程组成为终端的前台进程组,其他进程组成为后台进程组,只有前台进程组中进程才能从控制终端读取输入。

当控制终端连接建立,会话首进程会成为该终端的控制进程

操作函数:

????????getpgrp(void);获取进程组id

????????getpgid(pid_t pid); 获取指定进程的组id;

????????setpgid(pid_pid, pid_t pgid)设置进程pid的进程组

????????getsid(pid_t pid)获取指定进程的会话id;

????????setsid(void) 设置会话id

守护进程(Daemon进程)

守护进程:后台服务进程,生存期较长,常独立于控制终端并且周期性地执行某任务或等待处理某些发生的事件,一般d结尾。

特点:

? ? ? ? 1 生命周期长,在系统启动时被创建并一直运行直到系统关闭

? ? ? ? 2 在后台运行并且不拥有控制终端。所以内核不会为守护进程自动生成任何控制信号和终端相关信号(SIGINIT,SIGQUIT..)(不能被控制终端的ctrl c等杀死) 但可以用kill -9给进程发送信号,杀死。

?linux很多服务器 , 如Internet的 inetd,Web的httpd都用守护进程实现。

创建步骤

? ? ? ? 1)fork()后,父进程退出,子进程继续执行 、

????????????????如果不退出,终端会显示提示符,并且fork要确保子进程不会是当前进程组首进程,否则之后setsid()两个会话进程号一样,冲突。

? ? ? ? 2)子进程调用setsid()开启一个新会话

? ? ? ? ? ? ? ?调用setsid函数的进程成为新的会话的首进程,并与其父进程的会话组和进程组脱离。
由于会话对控制终端的独占性,进程同时与控制终端脱离。

? ? ? ? 3)清除进程的umask 确保守护进程创建文件和目录时拥有所需权限

? ? ? ? 4)修改进程当前工作目录,一般改为根目录/ (u盘打开,不好卸载) 可选。

? ? ? ? 5)关闭守护进程从父进程继承而来的所有打开着的fd。

????????????????不关,0 1 2 标准输入标准输出 标准错误会输出到终端。

? ? ? ? 6) 关闭文件描述符0 1 2 后,通常会打开 /dev/null,重定向,使用dup2()使所有fd指向这个设备

? ? ? ? ? ? ? ? 往 /dev/null这个里写的,会被丢弃。? 就不会向我们现在终端输入信息。

? ? ? ? 核心业务逻辑

使用守护进程每2s向文件写入当前系统时间

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <signal.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
using std::cout;
using std::endl;

void work(int num)
{   
    //获取系统时间,写入磁盘文件
    time_t tm=time(nullptr);
    struct tm* ts=localtime(&tm);
    char * lst=asctime(ts);
    int fd=open("time.txt",O_RDWR|O_CREAT|O_APPEND,0664);
    write(fd,lst,strlen(lst));
    close(fd);
}

int main()
{
    //创建子进程,退出父进程
    pid_t pid = fork();
    if(pid>0)
        exit(0);
    
    //将子进程提升为会话
    setsid();

    //清除umask 
    umask(022);

    //更改工作目录
    chdir("./");

    //关闭,重定向fd
    int fd = open("/dev/null",O_RDWR);
    dup2(fd,STDIN_FILENO);
    dup2(fd,STDOUT_FILENO);
    dup2(fd,STDERR_FILENO);

    //业务逻辑

    struct sigaction act;
    act.sa_flags=0;
    act.sa_handler=work;
    sigemptyset(&act.sa_mask);   
    sigaction(SIGALRM,&act,nullptr);

    struct itimerval val;
    val.it_interval.tv_sec=2;
    val.it_interval.tv_usec=0;

    val.it_value.tv_sec=2;
    val.it_value.tv_usec=0;
    setitimer(ITIMER_REAL,&val,nullptr);

    while(1)
    {
        
    }
    return 0;
}

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:32:30  更:2022-04-01 00:34:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:42:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码