守候进程

启动方式:

  •   在系统启动时由/etc/rd.d目录下的启动脚本启动
  •   利用inetd超级服务器启动
  •   有cron命令定时启动,以及在终端用nohup命令启动

守护进程编程要点

(1)屏蔽有关控制终端操作的信号,防止守护进程正常启动之前,控制终端受到干扰退出或挂起。

for(i = ; i <= ; i++)
signal(SIGTTOU, SIG_IGN); //忽略所有可以忽略的信号,STGSTOP和SIGKILL不能忽略

(2)在后台运行,为了避免挂起控制终端。方法在进程中创建子进程,并使父进程终止。

if(pid = fork())
exit(); //父进程结束,子进程继续

(3)脱离控制终端和进程组。用setsid()使子进程成为新的会话组长,彻底脱离从父进程继承下来的控制终端的影响

setsid();

(4)禁止进程重新打开控制终端。只有会话组长能够打开终端,再创建一个子进程,并让父进程退出,这样子进程就不是会话组长了。

if(pid = fork())
exit(); //父进程结束,子进程继续

(5)关闭打开的文件描述符。一般,不需要从父进程那继承来的文件描述符。

#define NOFILE 256  //不同系统有不同限制
for(i = ; i < NOFILE; i++) //关闭打开的文件描述符
close(i);

(6)改变当前工作目录。进程活动时,其工作目录所在的文件系统不能卸载。故需要将守候进程的工作目录改变到合适的目录

chdir("/tem");

(7)重设文件创建掩码。防止修改守护进程所创建文件的存储权限

umask();

(8)处理SIGCHLD信号(子进程退出信号)。让系统帮助回收僵死进程资源

signal(SIGCHLD, SIG_IGN);

守候进程两种写日志信息的方式

(1)进程直接与日志文件建立联系,即open一个文件,然后write写文件

(2)使用日志守候进程syslogd

void openlog (__const char *__ident, int __option, int __facility):打开当前程序与日志守候进程之间的联系。

  参数1:要向每个消息加入的字符串,一般为当前进程名

  参数2:描述已打开选项

  参数3:消息类型,决定将消息写入那个日志文件中

void closelog(void):关闭与日志守候进程的联系

void syslog (int __pri, __const char * __fmt, ...) :写一条日志信息

  参数1:决定日志级别 0系统不可用,1必须立刻报告的 2冲突 3错误 4警告 5普通担忧特殊标识 6消息 7调度级

  参数2:日志输出格式,类似printf的第二个参数

int setlogmask (int __mask) :设置当前进程syslog()函数输出消息的默认优先级

守候进程例子

#include<unistd.h>
#include<signal.h>
#include<fcntl.h>
#include<sys/syslog.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h> int init_daemon(const char *pname, int facility)
{
int pid;
int i;
signal(SIGTTOU, SIG_IGN); //处理可能的终端信号
signal(SIGTTIN, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
signal(SIGHUP, SIG_IGN); if(pid = fork()) //创建子进程,父进程退出
exit(EXIT_SUCCESS);
else if(pid < )
{
perror("fork");
exit(EXIT_FAILURE);
}
setsid(); //设置新会话组长
if(pid = fork()) //创建子进程,父进程退出
exit(EXIT_SUCCESS);
else if(pid < )
{
perror("fork");
exit(EXIT_FAILURE);
}
for(i = ; i < NOFILE; ++i) //关闭父进程打开的文件描述符
close(i);
open("/dev/null", O_RDONLY); //对标准输入输出全部重定向到/dev/null
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR); chdir("/tmp"); //修改主目录
umask(); //重新设置文件掩码
signal(SIGCHLD, SIG_IGN); //处理子进程退出
openlog(pname, LOG_PID, facility); //与守候进程建立联系,加上进程号,文件名
return;
} int main(int argc, char * argv[])
{
FILE *fp;
time_t ticks;
init_daemon(argv[], LOG_KERN); //执行守候进程函数
while()
{
sleep();
ticks = time(NULL); //获取当前时间
syslog(LOG_INFO, "%s", asctime(localtime(&ticks))); //写日志信息
}
}

可以看到,守候进程在后台运行

运行后我找不到日志写哪了?

还有很奇怪的一点,之后每次我用ps aux|grep Daemon_exp 进程号都会加2 ?

【linux高级程序设计】(第八章)进程管理与程序开发 5的更多相关文章

  1. Linux高级调试与优化——进程管理和调度

    进程管理 进程和文件是Linux操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...

  2. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  3. Linux下取代top的进程管理工具 htop

    一.htop 简介 This is htop, an interactive process viewer for Linux. It is a text-mode application (for ...

  4. Linux常用命令_(进程管理)

    进程管理:ps.top.kill 指令名称:ps语法:ps [选项]-a显示所有终端机下执行的程序.-e显示所有程序.-f显示UID,PPIP,C与STIME栏位.功能描述:查看系统中运行的进程.范例 ...

  5. Linux基础: 网络命令和进程管理

    ​  netstat lsof ps pstree pkill/kill (了解jenkins git,排查环境) 查询服务器之间是否有链接(netstat -an) 某个服务是否启动(了解服务对应的 ...

  6. Linux内核入门到放弃-进程管理和调度-《深入Linux内核架构》笔记

    进程优先级 硬实时进程 软实时进程 普通进程 O(1)调度.完全公平调度器 抢占式多任务处理(preemptive multitasking):各个进程都分配到一定的时间段可以执行.时间段到期后,内核 ...

  7. Linux基础--------监控系统、进程管理、软件包管理-------free、dd、kill、 rpm、yum、源码安装python

    作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...

  8. [Wolfgang Mauerer] 深入linux 内核架构 第二章 进程管理与调度【未完】

     作为Linux开发爱好者,从事linux 开发有三年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动, ...

  9. linux(centos)下安装supervisor进程管理工具

    在接触supervisor进程管理工具之前,使用springboot打包部署到linux服务器的流程是这样子的,如下图所示: 上图展示的就是最一般的流程,如果项目是小项目或者demo可以这样子去部署, ...

随机推荐

  1. BootCDN 开源项目免费 CDN 加速服务,Jquery插件库

    2017-11-17  19:38:32 免费好用的在线 css js 文件引用 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 Jquery插件库 .

  2. python面试题之介绍一下Python中webbrowser的用法

    所属网站分类: 面试经典 > python 作者:外星人入侵 链接: http://www.pythonheidong.com/blog/article/13/ 来源:python黑洞网 www ...

  3. [项目2] 10mins

    1.准备工作 M层:生成虚假数据 from django.db import models from faker import Factory # Create your models here. c ...

  4. BZOJ 3420: Poi2013 Triumphal arch

    二分答案 第二个人不会走回头路 那么F[i]表示在i的子树内(不包括i)所需要的额外步数 F[1]==0表示mid可行 k可能为0 #include<cstdio> #include< ...

  5. 1180: [CROATIAN2009]OTOCI(LCT)

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1200  Solved: 747[Submit][ ...

  6. android shape.xml 文件使用

    设置背景色可以通过在res/drawable里定义一个xml,如下: <?xml version="1.0" encoding="utf-8"?> ...

  7. datagrid的基本属性&查询和清空功能的实现

    1.datagrid基本属性 <script charset=UTF-8"> $(function(){ $("#datagrid").datagrid({ ...

  8. Django补充知识点——用户管理

    内容概要 1.Form表单2.Ajax3.布局,Django母板4.序列化5.Ajax相关6.分页7.XSS攻击8.CSRF9.CBV.FBV 10.类中用装饰器的两种方法 11.上传文件 12.数据 ...

  9. OpenStack之各组件介绍

    OpenStack简介 OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于:帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云. ...

  10. IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路

    在不知不觉当中已经写了21篇内容 其实一开始是没有想些什么东西的 只是买了Air后 感觉用着挺舒服的,每天可以躺在床上,就一台笔记本,不用网线,不用电源,不用鼠标,不用键盘,干干脆脆的就一台笔记本. ...