一、引言

工作中有时候可能会写一些这样的程序,它作为后台进程运行,生命周期比一般的进程要长,它在系统开机时运行,直到被强制关闭或者系统关机时退出。它就是精灵进程或者也叫做守护进程--daemon process

二、写精灵进程的步骤

1.创建子进程,退出父进程
2.改变文件的掩码
3.打开日志文件,以便向里面写入执行信息
4.创建唯一的会话ID(SID)
5.改变当前的工作路径到一个安全的地方
6.关闭标准文件描述符
7.编写实际的精灵进程代码

三、实例

/*******************************************************************************
* File Name : daemon.cpp
* Author : zjw
* Email : zjw_0722@163.com
* Create Time : 2015年01月05日 星期一 16时00分15秒
*******************************************************************************/ #include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std; int main(int argc, char **argv)
{
pid_t pid, sid; // Fork off the parent process
pid = fork();
if (pid < )
{
exit(-);
} // If we got a good PID, then we can exit the parent process.
if (pid > )
{
exit(-);
} // Change the file mode mask
umask(); // Open any logs here
ofstream fout("/var/log/daemon.log");
if (!fout)
{
exit(-);
} // Create a new SID(Session ID) for the child process
sid = setsid();
if (sid < )
{
// Log any failure
exit(-);
} // Change the current working directory
if ((chdir("/")) < )
{
// Log any failure
exit(-);
} // Close out the standard file descriptors
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO); // Daemon-specific initialization goes here // The big loop
while (true)
{
time_t timeNow;
time(&timeNow);
fout << asctime(localtime(&timeNow)) << endl; sleep();
}
cout << "over" << endl;
return ;
}

这只是一个简单的实例代码,简单的描述了编写精灵进程的大体步骤。其中我遇到了一个这样的问题,运行时出现错误,调试跟踪发现无法打开文件/var/log/daemon.log,明显是权限的问题。使用root用户运行,OK。这里也引出另外一个问题:如何调试fork的子进程?解决办法:Google gdb 多进程即可。

Linux之精灵进程的更多相关文章

  1. Linux系统编程@进程通信(一)

    进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

  2. Linux下java进程CPU占用率高分析方法

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  3. linux下对进程按照内存使用情况进行排序

    linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...

  4. Linux如何查看进程、杀死进程、启动进程等常用命令

    Linux如何查看进程.杀死进程.启动进程等常用命令 关键字: linux 查进程.杀进程.起进程1.查进程    ps命令查找与进程相关的PID号:    ps a 显示现行终端机下的所有程序,包括 ...

  5. linux下查看进程占用端口和端口占用进程命令

    Linux下查看进程占用端口: 查看程序对应进程号:ps –ef|grep 进程名 REDHAT :查看进程号所占用的端口号:netstat –nltp|grep 进程号 ubuntu:查看进程占用端 ...

  6. python实现Linux启动守护进程

    python实现Linux启动守护进程 DaemonClass.py代码: #/usr/bin/env python # -*- coding: utf-8 -*- import sys import ...

  7. Linux 服务器的网络配置 - 2. 查看 Linux 服务器的进程

    2. 查看 Linux 服务器的进程 1)ps [主要选项] -a  显示系统中所有进程的信息 -e  显示所有进程的信息 -f  显示进行的所有信息 -l   以长格式显示进程信息 -r  只显示正 ...

  8. Linux 线程与进程,以及通信

    http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...

  9. Linux之守护进程

    一.守护进程概述 在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进 程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一 ...

随机推荐

  1. easyui 后台系统引入富文本编辑器的使用

    1.首先,想在项目中引入相关的jar包 2.html页面中加入相关的引用 <!-- kindeditor --> <script type="text/javascript ...

  2. select标签中的选项分组

    select标签中的选项分组 <select name="showtimes"> <optgroup label="下午一点"> < ...

  3. jquery中remove()与detach()的区别

    说到删除节点,马上就会想到remove,不过原来还有一个detach,而且它们还是有区别的,就是detach保留了jquery的数据,而remove就会完全删除干净.所以如果在删除一个dom节点后还想 ...

  4. shadow mapping实现动态shadow实现记录 【转】

    http://blog.csdn.net/iaccepted/article/details/45826539 前段时间一直在弄一个室内场景,首先完成了render,效果还可以.然后给其加上shado ...

  5. Echarts 获取后台数据 使用后台数据展示 饼装图

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head& ...

  6. centos/7/isos/x86_64 下载

    为了节约有限的可用带宽. 不从mirror.centos.org下载iso映像 以下镜子应该可用的ISO映像: http://mirrors.aliyun.com/centos/7/isos/x86_ ...

  7. Android系统常用的权限

    开机自动允许  android.permission.RECEIVE_BOOT_COMPLETED,允许程序开机自动运行. 电量统计  android.permission.BATTERY_STATS ...

  8. iOS APP 上传

    原地址:http://www.cnblogs.com/uvsjoh/archive/2012/11/14/2769739.html 流程:1 开发好要发布的程序 -- 需要在程序中包含符合要求规格的i ...

  9. 算法笔记_160:算法提高 约数个数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 输入一个正整数N (1 样例输入 12 样例输出 6 样例说明 12的约数包括:1,2,3,4,6,12.共6个 2 解决方案 具体代码如下: im ...

  10. js foreach函数 注意事项(break、continue)

    foreach API说明: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Arra ...