打印
[boot]

Linux-编写简单守护进程

[复制链接]
543|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蒋博1026|  楼主 | 2019-7-30 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、任何一个进程都可以将自己实现成一个守护进程
2、create_daemon函数要素
(1)、子进程要等待父进程退出
(2)、子进程使用setsid创建新的会话期,脱离控制台
(3)、调用chdir将当前工作目录设置为/
(4)、umask设置为0以取消任何文件权限屏蔽
(5)、关闭所有文件描述符
(6)、将进程0、1、2定位到/dev/null
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void creat_daemon(void);
int main(void)
{
    creat_daemon();
    while()
    {
        printf(" i am running\n");
        sleep();
    }
   
    return 0;
}
void creat_daemon(void)
{
    pid_t pid =0;
   
    pid = fork();
    if(pid < 0)
    {
        perror("fork");
        exit(-1);
    }
    if(pid > 0)
    {
        exit(0);    //父进程直接退出
    }
    //能够执行到到这里的就是子进程了
   
    //setsid将当前进程设置为一个新的会话期session,
    //目的就是让当前进程脱离控制台
    pid = setsid();
    if(pid < 0)
    {
        perror("setsid");
        exit(-1);
    }
    //将当前进程工作目录设置为根目录
    chdir("/");
    //umask设置为0确保将来进程有最大的文件操作权限
    umask(0);
    //关闭所有文件描述符
    //先要获取当前系统中所允许打开的最大文件描述符数目
    int cnt = sysconf(_SC_OPEN_MAX);
    int i = 0;
    for(i = 0; i < cnt; i++)
    {
        close(i);
    }
    open("/dev/null", O_RDWR);//打开进程0,将其定位到/dev/null
    open("/dev/null", O_RDWR);//打开进程1,将其定位到/dev/null
    open("/dev/null", O_RDWR);//打开进程2,将其定位到/dev/null
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

323

主题

1820

帖子

18

粉丝