守护进程
时间:2022-07-24
本文章向大家介绍守护进程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
守护进程是一个在后台运行并且不受任何终端控制的进程。这也是守护进程最重要的特点。在Linux下创建守护进程的步骤如下。
- 创建子进程,终止父进程 这是因为守护进程是脱离终端控制的,所以要造成一种在终端里已经运行完的假象,把所有的工作都放在子进程中去完成。父进程退出后,子进程变成孤儿进程。
- 在子进程中创建新会话 这是因为即使子进程已经变成了孤儿进程,但是它始终是被父进程创建出来的,继承了父进程的会话、进程组、控制终端等等。创建了新的会话之后,子进程就脱离原会话的控制,摆脱了原进程组的控制,摆脱了原控制终端的控制。
- 更改当前工作目录为根目录 使用fork创建的子进程也继承了父进程的当前工作目录。由于在进程运行过程中,当前目录所在的文件系统不能卸载,因此,把当前工作目录换成其他的路径,如“/”或“/tmp”等。
- 重设文件掩码 由于通过fork函数创建的子进程继承了父进程的文件掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件创建掩码设置为0,可以大大增强该守护进程的灵活性。
- 关闭文件描述符 用fork新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。、
下面是在Linux系统下创建守护进程的一个简单示例。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define MAXFILE 65535
int main()
{
int i,fd;
pid_t pid;
char *buf = "create a dameonn";
int len = strlen(buf);
//创建子进程,终止父进程
pid = fork();
if(pid < 0)
{
perror("创建子进程失败");
exit(-1);
}
else if(pid > 0)
{
exit(0);
}
//建立新会话
setsid();
//更改工作目录
chdir("/");
//修改文件掩码
umask(0);
//关闭文件
for(i=0;i<MAXFILE;i++)
{
close(i);
}
while(1) //在后台一直运行
{
fd = open("/mnt/hgfs/共享文件夹/Linux环境编程/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0664);
if(fd < 0)
{
perror("open failed");
exit(-1);
}
write(fd,buf,len);
close(fd);
}
return 0;
}
执行以后,我们可以通过ps aux命令在终端看到daemon进程成为了一个守护进程。他的TTY标志是问号(?)。结果如下:
当我们不需要的守护进程的在后台继续执行的时候,可以通过kill -9 pid来杀死它。我们可以查看daemon.log文件的内容如下:
- win7 64位下如何折腾Tubro C 3.0
- TweenLite的又一应用:图片的拼图加载效果
- mysql创建数据表时如何判断是否已经存在?
- 温故知新:接口的隐式实现与显式实现
- 也谈枚举ToString()性能的改进
- silverlight:利用telerik中的zip类对字符串进行压缩、解压
- 索引,视图,存储过程和触发器文档
- 重点解读:用小程序给公众号涨粉10w的7大行业案例
- 网络域名与注册商标冲突的解决途径
- 网站代码优化我们必须要做的那些事
- 真是热闹! Slade.com等多个域名被曝交易
- python编码问题之"encode"&"decode"
- python3编码问题终结者--还搞不懂你来找我
- Pycharm集成PyQt4并使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android Studio 3.6中使用视图绑定替代 findViewById的方法
- Android 使用View Binding的方法详解
- CentOS一键安装Resilio Sync脚本
- Python从URL获取图片、读取图片格式并保存到本地
- Linux一键屏蔽指定国家所有的IP访问
- React基础(9)-React中发送Ajax请求以及Mock数据
- 一个快速引入CDN的workflow
- 在Ryzen平台上安装macOS High Sierra苹果系统
- v-selectpage 基于Vue2的高清重制版
- Android Studio3.6中的View Binding初探及用法区别
- Android日志文件的读写工具类
- <Go语言学习笔记>【数组与切片】
- Android Studio 3.6 新特性一览(推荐)
- 03 Linux下的SVN服务器搭建
- Android openGl 绘制简单图形的实现示例