【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可以这样子去部署, ...
随机推荐
- Python之路-基础数据类型之字符串
字符串类型 字符串是不可变的数据类型 索引(下标) 我们在日常生活中会遇到很多类似的情况,例如吃饭排队叫号,在学校时会有学号,工作时会有工号,这些就是一种能保证唯一准确的手段,在计算机中也是一样,它就 ...
- B1019 数字黑洞 (20分)
B1019 数字黑洞 (20分) 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复 ...
- WPF实现QQ群文件列表动画(二)
上篇(WPF实现QQ群文件列表动画(一))介绍了WPF实现QQ群文件列表动画的大致思路,结合我之前讲过的WPF里ItemsControl的分组实现,实现起来问题不大,以下是效果图: 其实就是个List ...
- 《Scrum实战》第4次课【全职的Scrum Master】作业汇总
1组: 孟帅 http://www.cnblogs.com/mengshuai1982/p/7375008.html 3组: 张亚辉 http://www.jianshu.com/p/df9eee08 ...
- NMF分解(二)
应用: 一.图像分析 NMF最成功的一类应用是在图像的分析和处理领域.图像本身包含大量的数据,计算机一般将图像的信息按照矩阵的形式进行存放,针对图像的识别.分析和处理也是在矩阵的基础上进行的.这些特点 ...
- 纯javascript验证,100行超精简代码。
这篇文章转自--寒飞,原帖地址http://blog.csdn.net/luoyehanfei/article/details/42262249 QQ交流群235032949 纯javascript验 ...
- php代码审计 strcmp和MD5函数漏洞
通过get得到三个值,v1,v2,v3. if第一层判断,v1和v2得到的值不一样,但是对它们进行md5加密后的值得相等. if第二层判断,v3得到的值得和$flag的值相等,满足这两个条件输出fla ...
- Robotium接入到Jenkins持续集成自动化测试
6.3 将测试用例接入到Jenkins 由于我是自己学习的手机自动化测试,没有实际投入到工作中使用,jenkins的接入也没有具体操作,现摘抄一下网页:http://www.tuicool.com/a ...
- [转载]在Robotium中使用ID
原文地址:在Robotium中使用ID作者:逍遥云翳 在Robotium的API中不提供使用ID的方式. 如果我们想在Robotium中使用ID就需要自己通过ID来找到控件的实例,然后通过Roboti ...
- Leetcode 636.函数的独占时间
函数的独占时间 给出一个非抢占单线程CPU的 n 个函数运行日志,找到函数的独占时间. 每个函数都有一个唯一的 Id,从 0 到 n-1,函数可能会递归调用或者被其他函数调用. 日志是具有以下格式的字 ...