Linux C语言 创建一个简单的守护进程
一、什么是守护进程?
首先我们先来简单了解一下什么是守护进程,守护进程在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.创建子进程,父进程退出 由于守护进程是在后台运行,脱离 ...
- Linux网络管理之四:创建一个简单的vsftpd服务器
VSFTPD主要配置文件如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...
- Linux中用maven创建一个简单的项目
maven简介 maven是Apache旗下的管理java项目jar包的项目管理工具,有了它可以很方便的构建管理java项目. 安装maven maven下载地址 http://maven.apach ...
- Linux中编写简单的守护进程
1.守护进程概述 守护进程就是通常所说的daemon进程,他是linux中的后台服务进程.他是一个生存期很长的进程,通常独立于控制终端并且周期性的执行某种任务,或等待处理魔种发生的事件.守护进程通常在 ...
- Linux守护进程service Daemon 【C语言构建简单的守护进程】
Linux Daemon Writing HOWTO 这里视频讲的很清楚 牛客网-c/C++Linux课程-守护进程 int main() {// 1.创建子进程,退出父进程pid_t pid = f ...
- Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
本文将演示如何利用namespace创建一个完整的容器,并在里面运行busybox.如果对namespace不是很熟悉,请先参考前面几遍介绍不同类型namespace的文章. busybox是一个Li ...
- 如何创建一个简单 APT 仓库
0. 无废话版本 需求: 有一堆 .deb 包,想把它们做成一个 APT 仓库,这样就可以用apk install pkgname进行安装了,这样一方面自己可以规避 dpkg -i xxx.deb 时 ...
- 练习1:创建一个简单的银行程序包
练习目标-Java 语言中面向对象的封装性及构造器的使用. 任务 在这个练习里,创建一个简单版本的(账户类)Account类.将这个源文件放入banking程序包中.在创建单个帐户的默认程序包中,已编 ...
- 使用html 语言建立一个简单的网页,如何用记事本建立简单的网页(1).doc
第九章 网页制作 实验一 用记事本建立简单的HTML文件 [实验目的] 学会用HTML语言建立一个简单的网页. [实验内容] 建立一个网页,布局自定,包括自我介绍.图片.自己的电子信箱地址等,要求在标 ...
最新文章
- 主席树 ---- 2021 ICPC 昆明 M.Stone Games [主席树 + 暴力]
- DNS SOA NS区别
- oppo手机显示服务器繁忙,如何玩转OPPO R11,五大隐藏功能你必须了解
- 经典C语言程序100例之二七
- 动态规划应用--双11购物凑单
- java数据库的量级_程序员学Python还是Java?分析了8张图后得出这个结论
- thinkphp5 memcached 安装、调用、链接
- 使用idea的的第一个坑-----javax.xml.ws.WebServiceRef
- mysql 怎么导入sql文件_如何在MySQL中使用命令行导入SQL文件?
- Django 官方文档中文3.2 4.0
- ps—ps,cs6图层面板解释,图层样式详解
- 第四天作业发布时间:2021-05-31 09:57:49相关课程:RHCSA2021-05-22 
- html文本下一页,Javascript html2canvas + jsPDF 导出PDF,解决一半文字在上一页一半文字在下一页的问题...
- R语言批量读取txt文件并合并
- 职教云计算机网络基础题库,智慧职教云课堂APP计算机组装与维护章节测试答案...
- chrome插件开发总结
- Oracle core读书笔记
- OPENGL简介---反走样
- 几张图告诉你程序员的残酷现状,培训机构出来的程序员可以吗
- Android音视频开发基础(七):视频采集-系统API基础
热门文章
- loadrunner破解以及超级license
- MySQL安装版本Navicat连接报错2509解决方案
- 《数据结构》—— 二叉树的复制、查深度与算结点操作
- Unity调试Android安装包
- 有趣现象:同一个java文件中有2个类,一个public,一个无类修饰符,各有一个main函数,谁在前先执行谁!
- 计算机考数学二英语二的学校,2020考研答疑:数学二和英语二,该怎么提前准备呢_工作和考研要如何选择-聚创考研网...
- Spring-aop面向切面
- 【笔记】ssd mobilenet 网络
- WinForm在窗体中嵌入窗体
- Android中Uri 和Path之间的相互转化