前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[linux] C语言Linux系统编程-做成守护进程

[linux] C语言Linux系统编程-做成守护进程

作者头像
唯一Chat
发布2019-09-10 10:42:16
2.9K0
发布2019-09-10 10:42:16
举报
文章被收录于专栏:陶士涵的菜地

守护进程:

必须是init进程的子进程,运行在后台,不与任何控制终端相关联。

通过以下步骤成为守护进程

1.调用fork()创建出来一个新的进程,这个新进程会是将来的守护进程

2.在新守护进程的父进程中,调用exit(),为了守护进程的爷爷进程确认父进程结束

3.在新守护进程中,调用setsid(),使得该进程有一个新的进程组和新的会话,保证了该进程不与控制终端相关联

4.用chdir()将当前工作目录改为根目录,因为前面fork出来的新进程,当前工作目录可能在文件系统的任何地方

5.关闭所有文件描述符

6.打开 0 1 2号文件描述符(标准输入,标准输出,标准错误),把它们重定向到/dev/null

代码语言:javascript
复制
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main(){
        int ret;
        //创建新进程
        ret=fork();
        //创建失败的直接返回
        if(ret<0){
                return -1;
        }
        //父进程直接结束
        if(ret>0){
                exit(EXIT_SUCCESS);
        }
        //创建新的进程组和会话
        ret=setsid();
        //失败的直接返回
        if(ret<0){
                return -1;
        }
        //改变当前工作目录
        chdir("/");
        //关闭所有文件描述符
        //标准输入输出重定向到/dev/null
        //NR_FILE 是系统在某一给定时刻,限制的文件总数
        for(int i=0;i<NR_FILE;i++){
                close(i);
        }
        open("/dev/null",O_RDWR);
        dup(0);
        dup(0);

        //下面可以写自己的操作...
        while(1){
                sleep(1);
        }
        return 0;
}

自带函数:daemon();

原型 int daemon(int nochdir,int noclose)

nochdir为0 改为根目录,noclose为0 关闭所有文件描述符

daemon(0,0)

代码语言:javascript
复制
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main(){
        daemon(0,0);
        //下面可以写自己的操作...
        while(1){
                sleep(1);
        }   
        return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档