Linux之精灵进程

一、引言

工作中有时候可能会写一些这样的程序,它作为后台进程运行,生命周期比一般的进程要长,它在系统开机时运行,直到被强制关闭或者系统关机时退出。它就是精灵进程或者也叫做守护进程--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 < 0)
    {
        exit(-1);
    }

    // If we got a good PID, then we can exit the parent process.
    if (pid > 0)
    {
        exit(-1);
    }

    // Change the file mode mask
    umask(0);

    // Open any logs here
    ofstream fout("/var/log/daemon.log");
    if (!fout)
    {
        exit(-1);
    }

    // Create a new SID(Session ID) for the child process
    sid = setsid();
    if (sid < 0)
    {
        // Log any failure
        exit(-1);
    }

    // Change the current working directory
    if ((chdir("/")) < 0)
    {
        // Log any failure
        exit(-1);
    }

    // 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(30);
    }
    cout << "over" << endl;        
    return 0;
}

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

 

posted @ 2015-01-05 16:59  冷冰若水  阅读(1602)  评论(0编辑  收藏  举报