一、什么是守护进程?

        首先我们先来简单了解一下什么是守护进程,守护进程在Linux中说白了就是一个后台进程,在后台默默服务,不受终端(会话)控制,生命周期长,在系统引导装入时启动,在系统关闭时终止,并且周期性的执行某种任务或等待处理某种事件。

如果想让某个进程不因为用户或终端或其他变化而受影响,也就是说,在如果一个进程不想因为切换用户或者关闭终端的时候结束该进程,那就可以把这个进程变为一个守护进程。

二、守护进程的创建

步骤如下:

1. 创建子进程2,结束父进程1

2. 设置当前子进程2为一个终端(会话)

3. 创建子进程3,结束父进程2

此时,子进程3已经勉强算是守护进程了,但我们还需要彻底切断子进程和用户之间的联系,即重定向标准输入、标准输出、标准错误输出到设备文件 /dev/null 里。

4. 关闭所有文件描述符,节省资源,减小守护进程的内存大小

5. 改变执行目录,将执行目录切换到根目录下

6. 修改权限掩码umask

7. 将标准输入、标准输出、标准错误输出重定向到 /dev/null

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>void demo_init(void);int main(int argc, char *argv[])
{demo_init();int fd = open("xx.txt",O_RDWR|O_CREAT|O_TRUNC,0664); //创建一个名为xx.txt的文件,权限为0664if(fd < 0){perror("open error");exit(1);}char buf[20] = "ni gan ma aiyou\n";while(1){sleep(1);bzero(buf,sizeof(buf));write(fd,buf,strlen(buf));    //将buf里的数据重复写入xx.txt里}close(fd);    //关闭文件描述符return 0;
}//创建守护进程
void demo_init(void){//创建一个子进程2,结束父进程1if(fork()) exit(0);    //将子进程2设置为终端(会话),摆脱原终端的影响if(setsid() < 0){perror("setsid error");exit(-1);}//再创建子进程3,结束父进程2,让子进程3不具备打开终端的能力if(fork())exit(0);//关闭所有文件描述符 //sysconf(_SC_OPEN_MAX)返回最大的文件描述符int i;for(i = 0;i <= sysconf(_SC_OPEN_MAX);i++) close(i);//更改子进程3的执行目录为根目录chdir("/");//修改权限掩码为0000 (默认为0002)umask(0);//重定向标准输入、标准输出、标准错误输出到null(设备文件的null)int fd = open("/dev/null",O_RDWR);dup(0); //产生fd1,指向0,0指向null,结果是标准输出1重定向到nulldup(0); //产生fd2, 指向0, 0指向null,结果是标准出错2重定向到null}

三、执行效果

1. 在命令行中执行

gcc demo.c -o demo -Wall

2. 因为我们要在根目录下创建xx.txt,不要忘记加sudo

sudo ./demo

3. 此时我们可以在根目录下看见 xx.txt

4. 关闭当前终端,重新打开终端,用命令 ps -aux 可以看到我们创建的demo进程还在,说明我们已经成功创建一个守护进程。

5. 结束进程,方法有两种,一是重启ubuntu系统,二是用命令kill掉

sudo kill -9 3240

Linux C语言 创建一个简单的守护进程相关推荐

  1. 创建一个简单的守护进程

    下面的内容是看了书上总结来的. 要写这样的一个程序看似复杂,但是它也是遵循一定的规则的.书中的方法介绍了用五个步骤来创建一个简单的守护进程. 1.创建子进程,父进程退出 由于守护进程是在后台运行,脱离 ...

  2. Linux网络管理之四:创建一个简单的vsftpd服务器

    VSFTPD主要配置文件如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  3. Linux中用maven创建一个简单的项目

    maven简介 maven是Apache旗下的管理java项目jar包的项目管理工具,有了它可以很方便的构建管理java项目. 安装maven maven下载地址 http://maven.apach ...

  4. Linux中编写简单的守护进程

    1.守护进程概述 守护进程就是通常所说的daemon进程,他是linux中的后台服务进程.他是一个生存期很长的进程,通常独立于控制终端并且周期性的执行某种任务,或等待处理魔种发生的事件.守护进程通常在 ...

  5. Linux守护进程service Daemon 【C语言构建简单的守护进程】

    Linux Daemon Writing HOWTO 这里视频讲的很清楚 牛客网-c/C++Linux课程-守护进程 int main() {// 1.创建子进程,退出父进程pid_t pid = f ...

  6. Linux Namespace系列(09):利用Namespace创建一个简单可用的容器

    本文将演示如何利用namespace创建一个完整的容器,并在里面运行busybox.如果对namespace不是很熟悉,请先参考前面几遍介绍不同类型namespace的文章. busybox是一个Li ...

  7. 如何创建一个简单 APT 仓库

    0. 无废话版本 需求: 有一堆 .deb 包,想把它们做成一个 APT 仓库,这样就可以用apk install pkgname进行安装了,这样一方面自己可以规避 dpkg -i xxx.deb 时 ...

  8. 练习1:创建一个简单的银行程序包

    练习目标-Java 语言中面向对象的封装性及构造器的使用. 任务 在这个练习里,创建一个简单版本的(账户类)Account类.将这个源文件放入banking程序包中.在创建单个帐户的默认程序包中,已编 ...

  9. 使用html 语言建立一个简单的网页,如何用记事本建立简单的网页(1).doc

    第九章 网页制作 实验一 用记事本建立简单的HTML文件 [实验目的] 学会用HTML语言建立一个简单的网页. [实验内容] 建立一个网页,布局自定,包括自我介绍.图片.自己的电子信箱地址等,要求在标 ...

最新文章

  1. 主席树 ---- 2021 ICPC 昆明 M.Stone Games [主席树 + 暴力]
  2. DNS SOA NS区别
  3. oppo手机显示服务器繁忙,如何玩转OPPO R11,五大隐藏功能你必须了解
  4. 经典C语言程序100例之二七
  5. 动态规划应用--双11购物凑单
  6. java数据库的量级_程序员学Python还是Java?分析了8张图后得出这个结论
  7. thinkphp5 memcached 安装、调用、链接
  8. 使用idea的的第一个坑-----javax.xml.ws.WebServiceRef
  9. mysql 怎么导入sql文件_如何在MySQL中使用命令行导入SQL文件?
  10. Django 官方文档中文3.2 4.0
  11. ps—ps,cs6图层面板解释,图层样式详解
  12. 第四天作业发布时间:2021-05-31 09:57:49相关课程:RHCSA2021-05-22 
  13. html文本下一页,Javascript html2canvas + jsPDF 导出PDF,解决一半文字在上一页一半文字在下一页的问题...
  14. R语言批量读取txt文件并合并
  15. 职教云计算机网络基础题库,智慧职教云课堂APP计算机组装与维护章节测试答案...
  16. chrome插件开发总结
  17. Oracle core读书笔记
  18. OPENGL简介---反走样
  19. 几张图告诉你程序员的残酷现状,培训机构出来的程序员可以吗
  20. Android音视频开发基础(七):视频采集-系统API基础

热门文章

  1. loadrunner破解以及超级license
  2. MySQL安装版本Navicat连接报错2509解决方案
  3. 《数据结构》—— 二叉树的复制、查深度与算结点操作
  4. Unity调试Android安装包
  5. 有趣现象:同一个java文件中有2个类,一个public,一个无类修饰符,各有一个main函数,谁在前先执行谁!
  6. 计算机考数学二英语二的学校,2020考研答疑:数学二和英语二,该怎么提前准备呢_工作和考研要如何选择-聚创考研网...
  7. Spring-aop面向切面
  8. 【笔记】ssd mobilenet 网络
  9. WinForm在窗体中嵌入窗体
  10. Android中Uri 和Path之间的相互转化