专栏首页陶士涵的菜地[linux] C语言Linux系统编程-做成守护进程

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

守护进程:

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

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

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

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

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

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

5.关闭所有文件描述符

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

#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)

#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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [日常] 算法-旋转字符串-暴力移位法

    给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串...

    陶士涵
  • [linux] C语言Linux系统编程-捕获进程信号

    sighandler_t signal(int signum, sighandler_t handler);

    陶士涵
  • [Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程

    首先遇到的问题是,部署nodejs的博客程序时,我把执行nodejs的命令放到后台,使用加&和nohup命令

    陶士涵
  • 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n...

    attack
  • Linux vmstat 命令详解

    vmstat  命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存...

    阳光岛主
  • MySQL为什么要给表加上主键

    1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」。如果给表上了主键,那么表在磁盘上的...

    不会飞的小鸟
  • Top命令学习

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

    zhangheng
  • Linux 当文件系统坏掉了该怎么整

    小手冰凉
  • Linux系统内存监控、性能诊断工具vmstat命令详解

    最近,烦心事有点多,博客也像是进入了便秘期。虽然还远远不到说放弃的地步,但总有一种挤不出牙膏的郁闷感。很怀念前几个月的冲劲和激情,一天都能存好几篇优质草稿。 看...

    张戈
  • 使用splice实现高效的代理服务器

    很多网络应用场景下, 当原设备与目标设备无法直接建立连接时,这时就需要一台代理服务器进行中转。代理服务器只需要将来自源设备的报文 原封不动的转发给目标设备,而并...

扫码关注云+社区

领取腾讯云代金券