Daemon的实现
来源:互联网 发布:魅族note6软件分身 编辑:程序博客网 时间:2024/06/07 03:24
注:Linux下可以直接调用damon函数来实现daemon进程,没必要重新实现,理解其原理即可。
在Linux中专门提供了一个函数来完成这个daemon化的过程,这个函数的原型如下
int daemon ( int __nochdir, int __noclose) ;
如果__nochdir的值为0,则将切换工作目录为根目录;如果__noclose为0,则将标准输入,输出和标准错误都重定向到/dev /null。
经过这个函数调用后的程序将运行在后台,成为一个daemon程序,而linux下大多的服务都是以此方式运行的。
我们来看一个简单的例子。例如编写例子程序test.c
#include <unistd.h> #include <stdio.h> int do_sth( ) { //Add what u want return 0 ; } int main( ) { daemon( 0 , 0 ) ; while ( 1 ) { do_sth( ) ; sleep( 1 ) ; } }
编译并运行
[ leconte@ localhost daemon] $ gcc -o test test.c [ leconte@ localhost daemon] $ ./ test
程序进入了后台,通过ps查看进程情况,可以看到进程的父进程id为1,即init进程
用lsof查看test进程所打开的文件,可以看到文件描述符0,1,2都被重定向到/dev/null
并且能够看到,进程的当前工作目录(cwd)为根目录/,daemon函数已经帮我们完成了daemon化的过程,接下来我们只需要关注于程序功能的实现了。
Linux 守护进程
Linux 守护进程概述
其实,linux提供了daemon函数用于创建守护进程,实现原理与上文中介绍的是一样的。
#include <unistd.h>
int daemon(int nochdir, int noclose);
1. daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序。
2. 当nochdir为0时,daemon将更改进城的根目录为root(“/”)。
3. 当noclose为0是,daemon将进城的STDIN, STDOUT, STDERR都重定向到/dev/null。
daemon的实现大致如下:
int daemon( int nochdir, int noclose )
{
pid_t pid;
if ( !nochdir && chdir("/") != 0 ) //如果nochdir=0,那么改变到"/"根目录
return -1;
if ( !noclose ) //如果没有noclose标志
{
int fd = open("/dev/null", O_RDWR);
if ( fd < 0 )
return -1;
/* 重定向标准输入、输出、错误 到/dev/null,
键盘的输入将对进程无任何影响,进程的输出也不会输出到终端
*/
dup(fd, 0);
dup(fd, 1);
dup(fd, 2);
close(fd);
}
pid = fork(); //创建子进程.
if (pid < 0) //失败
return -1;
if (pid > 0)
_exit(0); //返回执行的是父进程,那么父进程退出,让子进程变成真正的孤儿进程.
//创建的 daemon子进程执行到这里了
if ( setsid() < 0 ) //创建新的会话,并使得子进程成为新会话的领头进程
return -1;
return 0; //成功创建daemon子进程
}
使用实例:
int main()
{
daemon(1, 1); //参数根据需求确定
/* 在这里添加你需要在后台做的工作代码 */
}
如何杀死这样的进程:
通过ps+grep找到对应的后台进程,使用kill命令将进程杀死;也可创建shell脚本对进程的启动、关闭、重启进行自动管理,参考下文:
http://blog168.chinaunix.net/space.php?uid=20196318&do=blog&id=28824
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
int main(int argc, char *argv[])
{
char strCurPath[PATH_MAX];
if(daemon(1, 1) < 0)
{
perror("error daemon.../n");
exit(1);
}
sleep(10);
if(getcwd(strCurPath, PATH_MAX) == NULL)
{
perror("error getcwd");
exit(1);
}
printf("%s/n", strCurPath);
return 0;
}
- 库函数daemon的实现
- Daemon的实现
- daemon函数的实现
- Linux下Daemon的实现
- Linux下Daemon的实现
- Linux下Daemon的实现
- Linux下Daemon的实现
- Daemon程序的原理和实现
- 守护进程的模拟实现(daemon)
- daemon函数实现原理
- linux实现daemon程序
- daemon函数实现原理
- daemon函数实现原理
- 实现Linux Daemon 进程
- Linux下一个简单守护进程的实现 (Daemon)
- Linux daemon进程的应用、实现和原理
- C++实现Windows下的Daemon,监控多个进程
- Linux下一个简单守护进程的实现 (Daemon)
- ADB server didn't ACK解决办法
- VS2010打不开VS2012 .NET MVC 工程,及打开后部分模块加载不正确的解决办法
- 6 算法
- 商丘哪有卖钟表的 田园挂饰的那种
- easyui validatebox 验证集合
- Daemon的实现
- 走近SSH之Hibernate--Hibernate创建数据表并向表中写入数据(Hibernate+MySql)
- C++作业03_01: 将写的n封信和n个信封全部装错。设Dn为n封信装错信封可能的种类
- 原码反码补码
- AspectJ的Execution表达式
- java.sql.Date与java.util.Date的区别
- 要学习的知识—做个笔记方便查找
- phpcms搬站需要修改的地方,避免拉下
- 算法题:两数组所有和值的最小前 k 项