守候进程

启动方式:

  •   在系统启动时由/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. 三分钟明白 Activity工作流 -- java运用

    一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作 ...

  2. 5分钟带你快速理解Http协议

    HTTP协议 什么是HTTP协议 HTTP(Hyper Text Transfer Protocol)协议又叫超文本传输协议,是建立在TCP/IP协议之上的用来传递数据的协议.它不涉及数据包的传递,主 ...

  3. 2017 ACM-ICPC网络赛 H.Skiing 有向图最长路

    H.Skiing In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort h ...

  4. 【Isamaru, Hound of Honda】SVN常用命令补遗

    一些常用的 就是svn commit的时候 都必须是最新版本的东西 不能不是,但是其实只是.svn在控制,所以可以update到最新版本再svn merge -r 20:10 将版本10和20的融合, ...

  5. HDU_6194 后缀数组+RMQ

    好绝望的..想了五个多小时,最后还是没A...赛后看了下后缀数组瞬间就有了思路...不过因为太菜,想了将近两个小时才吧这个题干掉. 首先,应当认为,后缀数组的定义是,某字符串S的所有后缀按照字典序有小 ...

  6. [项目2] 10mins

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

  7. 非负矩阵分解(NMF)原理及算法实现

    一.矩阵分解回想 矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积.对于上述的用户-商品(评分矩阵),记为能够将其分解为两个或者多个矩阵的乘积,如果分解成两个矩阵和 .我们要使得矩阵和 的乘积能够还 ...

  8. Git之2分钟教程

    Git之2分钟入门 普通人:“借我1000块钱”.程序猿:“借你1024吧,凑个整”. 今天是1024,是我们程序员的节日,在此,首先祝各位程序猿以及程序媛们节日快乐~然后送出一份节日礼物,没错,就是 ...

  9. IOS开发---菜鸟学习之路--(一)

    PS(废话): 看了那么多的博客文章,发现大部分人都一直在强调写技术博客的重要性,索性自己也耐着性子写写看吧. 写博客的重要性之类的说明,我就不做复制黏贴的工作了.因为自己没有写过多少,所也不清楚是不 ...

  10. Selenium自动化测试框架的搭建 (转)

    http://www.51testing.com/html/96/86796-851606.html