您的位置:首页 > 其它

创建守护进程 daemon

2012-12-26 15:09 162 查看
在后台一直运行的进程为守护进程。

建立守护进程的5个步骤:

1,fork()创建子进程后,父进程立即退出。这样子进程就变为孤儿进程。

2,调用setsid():是创建的进程脱离控制终端,同时创建新的 进程组,使得新创建的进程为该进程组的首进程。

3,再用fork(),产生 的子进程将继承父进程的当前工作目录。注:如果当前进程没结束,其工作目录就不能被卸载,为了避免这种情况,需将工作目录切换下,chdir(“/home/”)。

4,关闭文件描述符。新的子进程继承了父进程打开的文件描述符,子进程不用这些,需要将其关闭。

5,守护进程创建了一些临时文件,umask()将这些屏蔽。

用scribes建立daemon.c文件:

#include<stdlib.h>

#include<unistd.h>

#include<signal.h>

#include<sys/param.h>

#include<sys/types.h>

#include<sys/stat.h>

#include <stdio.h>

#include <time.h>

void init_daemon(void) //守护进程初始化函数

{

int pid;

int i;

if(pid=fork()) //步骤1

exit(0); //是父进程,结束父进程

else if(pid< 0)

exit(1); //fork失败,退出

setsid(); //步骤2

if(pid=fork()) //步骤3

exit(0); //是第一子进程,结束第一子进程

else if(pid< 0)

exit(1); //fork失败,退出

chdir("/tmp"); //改变工作目录到/tmp

for(i=0;i< NOFILE;++i) //关闭打开的文件描述符 步骤4

close(i);

umask(0); //重设文件创建掩模 //步骤5

return;

}

void init_daemon(void);

int main(int argc,char* argv[])

{

FILE *fp;

time_t t;

init_daemon(); //初始化为Daemon

while(1) //每隔一分钟向test.log报告运行状态

{

sleep(60); //睡眠一分钟

if((fp=fopen("test.log","a")) >=0)

{

t=time(0);

fprintf(fp,"I'm here at %s\n",asctime(localtime(&t)));

fclose(fp);

}

}

return 0;

}

输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: