守护进程的创建(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(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
随机推荐
- 20145205 武钰 《网络对抗》Exp8 Web基础
一点题外话 本次实验我三号完成的,由于一些原因吧,一直没发博客,拖到了现在,这里说就是评判一下自己的懒惰. 实验后问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能. 一个表单有三个基本组成 ...
- 探索Java8:(三)Predicate接口的使用
上一篇学习了下Function接口的使用,本篇我们学习下另一个实用的函数式接口Predicate. Predicate的源码跟Function的很像,我们可以对比这两个来分析下.直接上Predicat ...
- 剑指Offer——跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路分析 这个问题可以先从简单开始考虑,台阶只有1阶,只有1种跳法,台阶有2阶,有2种跳法:一种两 ...
- IIS中添加ftp站点
1.创建Windows账号 右击点击“我的电脑”,选择“管理”打开服务器管理的控制台.展开“服务器管理器”,一路展开“配置”.“本地用户和组”,点“用户”项.然后在右边空白处点右键,选择“新用户”将打 ...
- Linux(CentOS 6.5) 下安装MySql 5.7.18 二进制版本粗浅攻略
鉴于Linux和mysql因不同版本,安装方式也不同,所以在阅读本攻略前,请确保各位同学的版本和我的Linux.MySql 版本一致. 如果不一致,只能参考. 我的版本: Linux CentOS 6 ...
- Java I/O学习 文件读写工具
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import jav ...
- Python - Cookie绕过验证码登录
前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 另一篇博文 P ...
- react新的生命周期
一. react16当前生命周期 componentWillMountrender前,所以setState不会重新渲染,服务端渲染唯一调用,推荐用constructor代替之 render compo ...
- C#对GZIP压缩和解压
/// <summary> /// 将Gzip的byte数组读取为字符串 /// </summary> /// <param name="bytes" ...
- docker on mac:误删default vm的处理方法
通过docker-machine 重新建一个vm,在virtualbox里可以直接看到多出来一个vm docker-machine create --driver virtualbox default