- #include "wrap.h"
- #define MYDOMAIN_FLAG "/tmp/.mydomain_log"
- void domain_end(){
- Unlink(MYDOMAIN_FLAG);
- }
- int domain_init(){
- int fd;
- fd=open(MYDOMAIN_FLAG,O_RDWR|O_CREAT|O_EXCL|O_APPEND,0600);
- if(fd==-1)
- err_sys(errno,"domain faild, %s",MYDOMAIN_FLAG);
- Dup2(fd,1);
- Dup2(fd,2);
- return fd;
- }
- /*
- 功能:
- work函数为我们的工作函数,他的返回值,会被init()系统进程收集作为守护的退出码
- 参数:
- argc,argv均为入口函数main()的参数副本。
- */
- int work(int argc,char **argv){
- while(1){
- sleep(60);
- err_msg("one loop....");
- }
- return 0;
- }
- int start_domain(int argc,char **argv,int (*work)(int argc,char **argv)){
- pid_t pid;
- int fd,ecode;
- fd=domain_init();
- if(Fork()==0){
- if(Fork()==0){
- Atexit(domain_end);
- err_msg("domain has ran sucessfully....");
- /*如果work()的返回时间比其父进程调用exit(0)的时间早,将不会被init()进程领养。以后我们会用管道的特点来同步父子进程。*/
- ecode=work(argc,argv);
- exit(ecode);
- }
- exit(0);
- }
- Wait(NULL);
- return 0;
- }
- int main(int argc,char **argv){
- return start_domain(argc,argv,work);
- }
- //该片段来自于http://www.codesnippet.cn/detail/040520149449.html
来源: http://www.codesnippet.cn/detail/040520149449.html