如何写一个简单的守护(精灵)进程原型

这里首先假设读者知道守护进程的大概概念,下面我们直接看程序。

//****************

环境,OS = Ubuntu 10.4 编译器 = gcc 4.5.2

******************//

int main(int argc, char **argv)

{

   //因为下面要关掉某些信号,所以需要

    struct sigaction sa;

   int i, fd, fdtablesize;

    

   //上来第一件事,调用umask将文件模式创建屏蔽字设置为0,为的是防止守护进程可能不具有对文件读写的权限

    umask(0);

//设置信号处理函数,SIG_IGN为忽略信号

  sa.sa_handler = SIG_IGN;

//sa.sa_mask这个成员的清零,一定要使用sigemtpy函数

sigemptyset(&sa.sa_mask);

sa.sa_flags = 0;

//对以下几种信号做忽略处理

sigaction(SIGTTOU, &sa, NULL);

sigaction(SIGTTIN, &sa, NULL);

sigaction(SIGTSTP, &sa, NULL);

sigaction(SIGUP, &sa, NULL);

 

//关闭父进程,使子进程成为孤儿进程,从而被init收养

if(fork() != 0)

{

       exit(1);

}   

//创建一个新会话

if(setsid() < 0)

{

     exit(1);

}

//第二次退出父进程

if(fork() != 0)

{

       exit(1);

}

//改变工作路径到root,防止出现工作目录被卸载的情况

if(chidr("/") == -1)

{

      exit(1);

}

//关闭打开的文件描述符,包括标准输入输出和标准出错

for(fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++)

{

      close(fd);

}

//再次关掉信号

sigaction(SIGCHLD, &sa, NULL);

//进入一个死循环让守护进程常驻内存

while(1)

{

      //do somthing

       sleep(1);

}

//至此就完成了对一个守护进程的初始化

return 0;

}


你可能感兴趣的:(工作,struct,ubuntu,gcc,null,编译器)