7 demonio de Linux


Prefacio (incluido el índice)


Demonio
Caracteristicas El proceso de servicio en segundo plano es
independiente del terminal de control y
periódicamente realiza una determinada tarea. No se
ve afectado por el inicio y cierre de sesión del usuario.
Generalmente d, se utiliza el nombre que termina en (servicio).
Grupo de proceso Líder de grupo: el
primer proceso

ID de grupo de proceso:
el ID del líder de grupo
Sesión (múltiples grupos de procesos) Crear una sesión:
* No puede ser el líder del grupo de procesos
* El proceso que crea la sesión se convierte en el líder del nuevo grupo de procesos
* Algunas distribuciones de Linux requieren root
* La nueva sesión creada descartará la terminal de control original
* Pasos generales: fork () en \ Crear un proceso hijo, el proceso padre muere y el proceso hijo realiza una operación de

creación de sesión. Crear una sesión:
setsid ()

Obtener el ID de sesión:
getsid ()
Crea un modelo del demonio Fork () el proceso hijo, el proceso padre sale del
proceso hijo, crea una nueva sesión,
cambia el directorio de trabajo actual, chdir
restablece la máscara del archivo,
cierra el descriptor del archivo y
realiza el trabajo principal
/**
 * @author IYATT-yx
 * @brief 将当前系统时间写入文件
 */
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/time.h>
#include <stdbool.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

// 捕捉到信号后,被执行的回调函数
// 获取系统当前时间,并写入 /tmp/currentTime
void saveTime(int no)
{
    
    
    if (no == SIGALRM)
    {
    
    
        time_t currentTime;
        time(&currentTime);
        const char *timeStr = ctime(&currentTime);
        int fd = open("/tmp/currentTime", O_WRONLY | O_CREAT, 0664);
        write(fd, timeStr, strlen(timeStr));
        close(fd);
    }
}

int main(void)
{
    
    
    pid_t pid = fork();
    if (pid > 0)
    {
    
    
        return 0;
    }
    else if (pid == 0)
    {
    
    
		// // // // // // // // //
		// 创建守护进程的常用模型 //
		// // // // // // // // //
		// 创建会话
		// 修改工作目录,不依赖运行时的路径
		// 修改掩码,置为 0, 则进程创建文件时,设置的权限即为创建出的文件实际的权限 (创建文件设置的权限 & ~umask)
		// 关闭默认文件描述符
        setsid();
        chdir("/home");
        umask(0);
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

        // 注册信号捕捉
        struct sigaction sig;
        sig.sa_handler = saveTime;
        sig.sa_flags = 0;
        sigemptyset(&sig.sa_mask);
        sigaction(SIGALRM, &sig, NULL);

        // 定时器
        struct itimerval val;
        // 首次
        val.it_value.tv_sec = 1;
        val.it_value.tv_usec = 0;
        // 周期
        val.it_interval.tv_sec = 1;
        val.it_interval.tv_usec = 0;
        setitimer(ITIMER_REAL, &val, NULL);

        while (true)
        {
    
    
            sleep(1);
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45579994/article/details/112935000
Recomendado
Clasificación