首页 > 代码库 > Linux之精灵进程
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 多进程即可。
Linux之精灵进程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。