zoukankan      html  css  js  c++  java
  • 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 多进程即可。

  • 相关阅读:
    全局临时表的应用 Timothy
    结合windows服务的Socket聊天室 Timothy
    阿拉伯数字转换成金额大写金额(包括小数) Timothy
    回文字符串和栈 Timothy
    SQL 读取不连续的第30到40之间的数据 Timothy
    C#中as和is关键字 Timothy
    嵌套事务和事务保存点的错误处理 Timothy
    隐式事务 Timothy
    float,double和decimal类型 Timothy
    string 值类型还是引用类型 Timothy
  • 原文地址:https://www.cnblogs.com/lit10050528/p/4204024.html
Copyright © 2011-2022 走看看