守护进程的创建(syslog函数)
守护进程(daemon)是指在后台运行的,没有控制终端与之相连的进程。它独立于控制终端,通常周期性的执行某种任务。
守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程的方式实现的,如Internet服务器进程inetd,Web服务器进程http等。守护进程在后台
运行,类似于windows中的系统服务。
守护进程的启动方式:
1、系统启动时从启动脚本/etc/rc.d中启动
2、作业规划进程crond启动
3、用户终端(shell)执行
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
创建守护进程的步骤:
1、fork产生一个子进程,让父进程退出
2、调用setsid创建一个新会话。控制终端,登陆会话和进程组通常是从父进程继承下来的。
守护进程要摆脱他们,不受他们的影响,其方法是调用setsid使进程成为一个会话组长
注意:当进程是会话组长时,调用setsid会失败,当时第一点保证了进程不是会话组长。setsid调用成功后,进程成为新的会话组长和进程组长,
并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。
3、禁止进程重新打开控制终端。以上步骤,进程已经成为一个无终端的会话组长,但是他可以重新申请打开一个终端。为了避免这种情况的发生,可以通过使进程不再是会话
组长来实现。再一次通过fork创建一个新的子进程,使调用fork的进程退出。
4、关闭不在需要的文件描述符。创建的子进程从父进程继承打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及无法预料的错误。
先得到最高的文件描述符,然后用一个循环过程,关闭0到最高文件描述符值的所有文件描述符。
5、将当前目录更改为根目录,当守护进程当前工作目录在一个装配文件系统时,该文件系统不能被拆卸。一般需要将工作目录改为根目录。
6、将文件创建时使用的屏蔽字设置为0,进程从创建他的父进程那里继承的文件创建屏蔽字可能会拒绝某些许可权。为防止这一点,使用umask(0)将屏蔽字清零。
7、处理SIGCHLD信号。这一步不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将会成为僵尸进程,从而占用系统资源。如果父进程等待子进程结束,
将增加父进程的负担,影响服务器进程的并发性。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。这样,子进程结束时不会产生僵尸进程。
#include <time.h>
#include <syslog.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h> int init_daemon()
{
int pid;
int i; /*忽略终端I/O信号,STOP信号*/
signal(SIGTTOU, SIG_IGN);
signal(SIGTTIN, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
signal(SIGHUP, SIG_IGN); /创建子进程/
pid = fork();
if(pid > )
{
//父进程退出,使得子进程成为后台进程
exit();
}
else if(pid < )
{
return -;
} //建立一个新的进程组,在这个新的进程组中,子进程成为这个进程组的首进程,以使该进程脱离所有终端
setsid(); //再次新建一个子进程,退出父进程,保证该进程不是进程组长,同时让该进程无法再打开一个新的终端
pid = fork();
if(pid > )
{
exit();
}
else if(pid < )
{
return -;
} //关闭所有从父进程继承的不再需要的文件描述符
for(i=;i<NOFILE;close(i++)); //改变工作目录,使得进程不与任何文件系统联系
chdir("/"); //将文件屏蔽字设置为0
umask(); //忽略SIGCHLD信号
signal(SIGCHLD, SIG_IGN); return ; } int main()
{
time_t now; init_daemon(); syslog(LOG_USER|LOG_INFO, "test daemon\n"); while()
{
sleep();
time(&now);
syslog(LOG_USER|LOG_INFO, "system time: %s", ctime(&now));
} }
系统ubuntu
注意使用syslog之前,需要先进行配置修改文件 /etc/rsyslog.d/50-default.conf
放开 user.* -/var/log/user.log 这行的注释。
重新启动rsyslog服务 切换到目录/etc/init.d
执行:
/etc/init.d# ./rsyslog stop
/etc/init.d# ./rsyslog start
关于syslog的配置:
http://blog.csdn.net/shi1122/article/details/8626629
守护进程的创建(syslog函数)的更多相关文章
- Linux系统编程之--守护进程的创建和详解【转】
本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终 ...
- linux下守护进程的创建
最近在学习linux c编程 看到了守护进程的创建,感觉很好玩, 测试环境ubuntu 15.04 下面贴出测试代码 #include <stdio.h> #include <std ...
- twemproxy源码分析2——守护进程的创建
twemproxy源码中关于守护进程的创建实现得比较标准,先贴出代码来,然后结合一些资料来分析和列举一些实现守护进程的常用方法,不过不得不说twemproxy的实现确实是不错的,注释都写在了代码中,直 ...
- 写守护进程时碰到open函数的参数,没记住
今天写一个最简单的守护进程, 要成为一个守护进程,其实很简单了.主要步骤就4步: 1,创建进程. 2,父进程退出. 3,成为会话的头领进程. 4,将工作目录改成根目录,并把标准输入输出重定向到空设备. ...
- Unix网络编程代码 第13章 守护进程和inetd超级服务器
1. 概述 守护进程是在后台运行且不与任何控制终端关联的进程.unix系统通常有很多守护进程在后台运行,执行不同的管理任务. 守护进程没有控制终端通常源于它们由系统初始化脚本启动.然而守护进程也 ...
- APUE读书笔记-第13章-守护进程
第13章 守护进程 13.1 引言 *守护进程也称精灵进程(daemon)是生存期较长的一种进程.它们常常在系统自举时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的.UNI ...
- apue学习笔记(第十三章 守护进程)
本章将说明守护进程结构,以及如何编写守护进程程序. 守护进程,也就是通常说的Daemon进程,是Unix中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理 ...
- 《Unix环境高级编程》读书笔记 第13章-守护进程
1. 引言 守护进程是生存期长的一种进程.它们常常在系统引导装入时启动,仅在系统关闭时才终止.它们没有控制终端,在后台运行. 本章说明守护进程结构.如何编写守护进程程序.守护进程如何报告出错情况. 2 ...
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
随机推荐
- Android MediaPlayer 操作
- 20145302张薇 《网络对抗技术》 web安全基础实践
20145302张薇 <网络对抗技术> web安全基础实践 实验问题回答 1.SQL注入攻击原理,如何防御 原理:攻击者把SQL命令插入到网页的各种查询字符串处,达到欺骗服务器执行恶意的S ...
- tensorflow之神经网络实现流程总结
tensorflow之神经网络实现流程总结 1.数据预处理preprocess 2.前向传播的神经网络搭建(包括activation_function和层数) 3.指数下降的learning_rate ...
- 【详解】Dubbo的原理以及详细原理、配置
Dubbo的背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. Dubbo的应用 用于大规模 ...
- hdu 2586 How far away ? 倍增求LCA
倍增求LCA LCA函数返回(u,v)两点的最近公共祖先 #include <bits/stdc++.h> using namespace std; *; struct node { in ...
- Ubuntu下Eclipse安装与编译ns-3遇见的各种问题
感觉Eclipse比其它东西装起来麻烦多了. 问题拾遗 (1)安装 这一块倒是没有什么大的问题,Linux操作系统也不需要像在Windows操作系统下下一些必须的东西(比如CDT等等).安装好了JDK ...
- JS进阶系列之this
在javascript中,this的指向是在执行上下文的创建阶段确定的,其实只要知道不同执行方式下,this的指向分别是是什么,就能很好的掌握this这个让人摸不透的东西. 一.全局执行 全局执行又分 ...
- 【Python】【数据类型】
[序列更新&散列&切片]"""from array import arrayimport reprlibarray1 = array('d',(1,2,3 ...
- 【NOI2013】小Q的修炼
题目链接:http://uoj.ac/problem/123 又开提答坑啦,要不是一定要讲题谁他妈要这样伤害自己 CASE 1,2 首先可以打一个通用暴力,用于模拟操作过程,对于每一个操作随机一个选择 ...
- idea 2018注册码(激活码)永久性的
2DZ8RPRSBU-eyJsaWNlbnNlSWQiOiIyRFo4UlBSU0JVIiwibGljZW5zZWVOYW1lIjoiY24gdHUiLCJhc3NpZ25lZU5hbWUiOiIiL ...