C语言创建守护进程(精灵进程)

1 守护进程

要了解什么是守护进程要先知道什么是孤儿进程

1.1 孤儿进程

父进程运行结束,但子进程未运行结束的子进程。然后子进程会被寄养到其他进程下

1.2 守护进程

特殊的孤儿进程,这种进程脱离终端,在后台运行。

1.3 使用场景

搭建服务器或者服务程序时

1.4 搭建守护流程

  1. 创建子进程,杀死父进程(父进程退出)

    fork,if pid > 0,exit
    
  2. 设置子进程为会话组组长

    setsid
    
    // 头文件
    #include <unistd.h>
    // 函数格式
    pid_t setsid(void);
    /*
     * 功能:
     *      创建新会话,设置调用进程为新会话组长
     * 参数:
     *      void
     * 返回值:
     *      成功返回SID,失败返回-1
     */
    
  3. 更改工作路径为根目录

    chdir
    
    // 头文件
    #include <unistd.h>
    // 函数格式
    int chdir(const char *path);
    /*
     * 功能:
     *      更改进程的工作路径
     * 参数:
     *      新的工作路径的首地址
     * 返回值:
     *      成功返回0,失败返回-1
     */
    
    
  4. 修改文件权限掩码

    umask
    
    // 头文件
    #include <sys/types.h>
    #include <sys/stat.h>
    // 函数格式
    mode_t umask(mode_t mask);
    /*
     * 功能:
     *      修改文件权限掩码
     * 参数:
     *      文件权限掩码
     * 返回值:
     *      成功返回之前的掩码值
     * 
     * 注意:
     *      真正的文件权限 = mode & ~umask
     */
    
  5. 关闭从父进程拷贝过来的多余的文件描述符

    getdtablesize
    close
    
    // 头文件
    #include <unistd.h>
    // 函数格式
    int getdtablesize(void);
    /*
     * 功能:
     *      获取当前进程文件描述列表的大小
     * 参数:
     *      void
     * 返回值:
     *      成功返回该进程的文件描述符的最大值
     */
    

1.5 具体案例

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

int main(int argc, const char *argv[])
{
	// 创建子进程
	pid_t pid = fork();
	if(pid > 0)
	{
		// 杀死父进程
		exit(0);
	}
	else if(0 == pid)
	{
		// 设置子进程为会话组组长
		setsid();
		// 更改工作路径为根目录
		chdir("/");
		// 修改文件权限掩码
		umask(0077);
		int size = getdtablesize();
		int i = 0;
		for(i = 3; i < size; i++)
		{
			// 关闭从父进程拷贝过来的多余的文件描述符
			close(i);
		}
		// 获取时间并写入到文件中
		int fd = open("mylog", O_CREAT | O_WRONLY, 0664);
		while(1)
		{
			time_t ti;
			sleep(10);
			ti = time(&ti);
			char *p = ctime(&ti);
			write(fd, p, strlen(p));
		}
		close(fd);
	}
	return 0;
}

执行程序
在这里插入图片描述
结果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DA0221

各位看官您往里面瞧一瞧看一看

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值