UNIX环境高级编程——初始化一个守护进程
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <syslog.h>
/* 创建守护进程函数 */
int daemonize(){
int childpid, fd, fdtablesize;
int error, in, out;
/* 忽略终端I/O信号,STOP信号 */
signal(SIGTTOU, SIG_IGN); /* 后台进程写控制终端 */
signal(SIGTTIN, SIG_IGN); /* 后台进程读控制终端 */
signal(SIGTSTP, SIG_IGN); /* 终端挂起 */
signal(SIGHUP, SIG_IGN); /* 进程组长退出时向所有会议成员发出的 */
/* 父进程退出,子进程成为孤儿进程 */
if (fork()!=0)
exit(1);
/* 设置新会话的领头进程,并与原来的登录会话和进程组脱离 */
if (setsid() == -1)
exit(1);
/* 防止会话组长重新申请控制终端,子进程退出,孙进程没有控制终端了 */
if (fork()!=0)
exit(1);
/* 关闭打开的文件描述符,防止资源浪费和防止引起无法预料的错误 */
for (fd = 3, fdtablesize = getdtablesize();fd < fdtablesize;fd++){
close(fd);
}
/* 重定向标准输入/标准输出和标准错误输出 */
error = open("./stderr", O_WRONLY|O_CREAT, 0600);
dup2(error, 2);
close(error);
in = open("./stdin", O_RDONLY|O_CREAT,0600);
dup2(in, 0);
close(in);
out = open("./stdout", O_WRONLY|O_CREAT,0600);
dup2(out, 1);
close(out);
/* 可以改变工作目录 */
/* chdir("/"); */
/* 重设文件创建掩模 */
umask(0);
/* 忽略SIGCHLD信号, 防止僵尸进程 */
signal(SIGCHLD, SIG_IGN);
return 0;
}
int main(void){
time_t now;
daemonize();
openlog("MyMsgDaemon", LOG_CONS | LOG_PID, 0);
syslog(LOG_DEBUG, "守护进程测试/n");
while (1){
time(&now);
syslog(LOG_DEBUG, "守护进程测试, 当前时间:[%s]/n", ctime(&now));
sleep(6);
}
return 0;
}
UNIX环境高级编程——初始化一个守护进程的更多相关文章
- Unix环境高级编程(十四)守护进程实现时间服务器
守护进程是在后台运行不受终端控制的进程(如输入.输出等),一般的网络服务都是以守护进程的方式运行.守护进程脱离终端的主要原因有两点:(1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务.( ...
- UNIX环境高级编程 第8章 进程控制
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...
- UNIX环境高级编程 第9章 进程关系
在第8章学习了进程的控制原语,通过各种进程原语可以对进程进行控制,包括新建进程.执行新程序.终止进程等.在使用fork( )产生新进程后,就出现了进程父子进程的概念,这是进程间的关系.本章更加详细地说 ...
- UNIX环境高级编程 第7章 进程环境
本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...
- (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- Unix环境高级编程——守护进程记录总结(从基础到实现)
一.概念及其特征 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行.守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程 ...
- Unix环境高级编程:守护进程
参考 Unix环境高级编程,第9,13章 介绍 守护进程就是Linux中使用ps aux那些一般以d结尾的程序,比如rsyslogd,sshd等,为daemon简称.他们是长期在后台执行的随终端关闭而 ...
- Unix环境高级编程(十三)守护进程
守护进程也称为精灵进程是一种生存期较长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.unix系统有很多守护进程,大多数 ...
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- ●BZOJ 3238 [Ahoi2013]差异
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3238 题解: 后缀数组套路深. 问题转化为求出任意两个后缀的LCP之和 在计算贡献时,各种不 ...
- ●BZOJ 2005 NOI 2010 能量采集
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题解: 一个带有容斥思想的递推.%%% 首先,对于一个点 (x,y) 在路径 (0,0 ...
- linux内核中的链表
1.内核中的链表 linux内核链表与众不同,他不是把将数据结构塞入链表,而是将链表节点塞入数据,在2.1内核中引入了官方链表,从此内核中所有的链表使用都采用此链表,千万不要在重复造车轮子了!链表实现 ...
- solr6.6初探之主从同步
1.关于solr索引数据同步 通常情况下,单节点部署的solr应用很难在并发量很大的情况下"久存",那么多节点部署提高Solr应用的负载量和响应时间势在必行. solr索引同步有以 ...
- 数据结构之B树、B+树(二)---代码实现
B-Tree | Set 1 (construct) Following is an example B-Tree of minimum degree 3. Note that in practica ...
- SSD-Tensorflow: 3 步运行 TensorFlow 单图片多盒目标检测器
昨天类似的 YOLO: https://www.v2ex.com/t/392671#reply0 下载这个项目 https://github.com/balancap/SSD-Tensorflow 解 ...
- 5步做一个 TensorFlow 聊天机器人:DeepQA
项目截图: 实测截图: 一步一步教程: 1.下载这个项目: https://github.com/Conchylicultor/DeepQA 2.下载训练好的模型: https://drive.goo ...
- JVM回收方法区内存
很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区进行垃圾收集的“性价比”一般比较低:在堆中,尤其是 ...
- audioplayer.js插件的使用及小bug
之前在项目里用audioplayer.js做的一个页面,改了布局样式,还有插件自身有个bug就是audio添加autoplay属性后有两个音频播放,其中一个无法控制,会一直播放,我查看了官网的demo ...
- RxSwift 系列(八) -- Error Handing Operators
前言 本篇文章我们将学习RxSwift中的错误处理,包括: catchErrorJustReturn catchError retry retry(_:) catchErrorJustReturn 遇 ...