【linux高级程序设计】(第八章)进程管理与程序开发 5
守候进程
启动方式:
- 在系统启动时由/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的更多相关文章
- Linux高级调试与优化——进程管理和调度
进程管理 进程和文件是Linux操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux下取代top的进程管理工具 htop
一.htop 简介 This is htop, an interactive process viewer for Linux. It is a text-mode application (for ...
- Linux常用命令_(进程管理)
进程管理:ps.top.kill 指令名称:ps语法:ps [选项]-a显示所有终端机下执行的程序.-e显示所有程序.-f显示UID,PPIP,C与STIME栏位.功能描述:查看系统中运行的进程.范例 ...
- Linux基础: 网络命令和进程管理
netstat lsof ps pstree pkill/kill (了解jenkins git,排查环境) 查询服务器之间是否有链接(netstat -an) 某个服务是否启动(了解服务对应的 ...
- Linux内核入门到放弃-进程管理和调度-《深入Linux内核架构》笔记
进程优先级 硬实时进程 软实时进程 普通进程 O(1)调度.完全公平调度器 抢占式多任务处理(preemptive multitasking):各个进程都分配到一定的时间段可以执行.时间段到期后,内核 ...
- Linux基础--------监控系统、进程管理、软件包管理-------free、dd、kill、 rpm、yum、源码安装python
作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...
- [Wolfgang Mauerer] 深入linux 内核架构 第二章 进程管理与调度【未完】
作为Linux开发爱好者,从事linux 开发有三年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动, ...
- linux(centos)下安装supervisor进程管理工具
在接触supervisor进程管理工具之前,使用springboot打包部署到linux服务器的流程是这样子的,如下图所示: 上图展示的就是最一般的流程,如果项目是小项目或者demo可以这样子去部署, ...
随机推荐
- 动态规划:HDU1160-FatMouse's Speed(记录动态规划状态转移过程)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Spring.Net初认识——竹子整理
留个脚印,过两天总结. 看到知乎上有人对于DI|IOC 的解释,满不错,收藏下先 作者:OneNoodle链接:http://www.zhihu.com/question/23277575/answe ...
- 设计模式之第5章-解释器模式(Java实现)
设计模式之第5章-解释器模式(Java实现) “开个商店好麻烦,做个收单的系统,发现类的方法好多.”“真是的,不就是简单的四则运算,这都不会!”你说你会啊.来来来,你把以下的方法用代码写出来: a+b ...
- c++ primer 6 练习题 (非复习题)
第7章 7.13-1调和平均数 //7.13-1 excise.cpp 调和平均数 #include <iostream> double calculate(double a,double ...
- maven学习(六)——在别的项目中引用通过Maven安装生成的项目的jar包
1.新建HelloFriend项目,同时建立Maven约定的目录结构和pom.xml文件 HelloFriend | --src | -----main | ----------java | - ...
- .net学习笔记--设计模式
设计模式都有哪些? 按照GOF提出,23种,按照目的分为:创建型(creational).结构性(structural).行为型(behavioral). 一.创建型: 1.Singleton 单例模 ...
- java如何建项目
java常开发的项目有哪几种? 这几种项目都是怎么建的?
- HDU3018 几笔画(非1笔)
Ant Trip Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 查看oracle日志路径
adrci ADRCI: Release 12.2.0.1.0 - Production on Tue Oct 9 16:14:35 2018 Copyright (c) 1982, 2017, Or ...
- BZOJ 1855: [Scoi2010]股票交易(DP+单调队列)
1855: [Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未 ...