linux下守护进程编写,Linux下后台守护进程的编写实例

Linux下后台守护进程的编写实例

tongxin | 2009-04-12 16:58:07    阅读:2357

db6c9df9ccb71c554faea6ec7ad19010.png发布文章

相信随着Linux的普及,大家都在写不少Linux下的程序了,尤其是一些服务端程序慢慢地都转到Linux下了吧。大家必然碰到问题是如何让自己的进程成为守护进程,在系统启动的时候运行,并且永远是后台进程。下面就写一个这样的程序了。源代码如下:

%A //init_daemon.c 开始///

%A #include

%A #include

%A #include

%A #include

%A #include

%A

%A /*********************************************************************

%A *filename: init_daemon.c

%A *purpose: 产生后台进程

%A *wrote by: zhoulifa(zhoulifa@163.com) 周立发

url.gifhttp://zhoulifa.bokee.com)

%A *date time:2006-03-10 01:00:00

%A *Thanks to: 北京工业大学 小胡(本文摘

url.gifhttp://www.qtcn.org/bbs/simple/index.php?t116.html)

%A *Note: 任何人可以任意复制代码并运用这些代码,当然包括你的商业用途

%A * 但请遵循GPL

%A *********************************************************************/

%A

%A void init_daemon(void)

%A {

%A int pid;

%A int i;

%A

%A if(pid=fork())

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

%A else if(pid< 0)

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

%A

%A //是第一子进程,后台继续执行

%A setsid();//第一子进程成为新的会话组长和进程组长

%A //并与控制终端分离

%A if(pid=fork())

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

%A else if(pid< 0)

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

%A //是第二子进程,继续

%A //第二子进程不再是会话组长

%A

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

%A close(i);

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

%A umask(0);//重设文件创建掩模

%A return;

%A }

%A //init_daemon.c 结束///

%A

%A 上面这是个通用的函数,可以让你的程序成为后台守护进程。

%A 下面是一个测试程序:

%A //daemontest.c 开始///

%A #include

%A #include

%A

%A /*********************************************************************

%A *filename: daemontest.c

%A *purpose: 测试后台进程

%A *wrote by: zhoulifa(zhoulifa@163.com) 周立发

url.gifhttp://zhoulifa.bokee.com)

%A *date time:2006-03-10 01:09:00

%A *Thanks to: 北京工业大学 小胡(本文参考了其文

url.gifhttp://www.qtcn.org/bbs/simple/index.php?t116.html)

%A *Note: 任何人可以任意复制代码并运用这些代码,当然包括你的商业用途

%A * 但请遵循GPL

%A *********************************************************************/

%A

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

%A void signal_reload(int signal)

%A {

%A /*当收到SIGUSR1信号时程序重新导入所有参数*/

%A FILE *fp;

%A time_t t;

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

%A {

%A t=time(0);

%A fprintf(fp,"I received signal(%d), reload all parameters at %s\n", signal, asctime(localtime(&t)) );

%A fclose(fp);

%A }

%A /*重新导入参数*/

%A }

%A

%A void signal_handle(int signal)

%A {

%A /*当收到SIGUSR2信号时程序退出*/

%A FILE *fp;

%A time_t t;

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

%A {

%A t=time(0);

%A fprintf(fp,"I received signal(%d), exit at %s\n", signal, asctime(localtime(&t)) );

%A fclose(fp);

%A }

%A exit(0);

%A }

%A

%A int main(int argc, char ** argv)

%A {

%A FILE *fp;

%A time_t t;

%A init_daemon();//初始化为Daemon

%A

%A signal(SIGCHLD, SIG_IGN);/*忽略子进程退出信号,若在此之后又产生了子进程,

%A 如果不处理此信号,将在子进程退出后产生僵尸进程*/

%A signal(SIGUSR1, signal_reload);/*处理SIGUSR1信号,可以定义此信号为重导参数信号*/

%A signal(SIGUSR2, signal_handle);/*处理SIGUSR2信号,可以定义此信号为退出信号*/

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

%A {

%A /*这是各位程序的主体部分,所以的工作在下面完成,比如http服务、FTP服务等*/

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

%A if((fp=fopen("test.log","a")) >=0)/*注意,由于在init_daemon里面已经把路径切换到了/tmp,因此此文件是/tmp/test.log*/

%A {

%A t=time(0);

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

%A fclose(fp);

%A }

%A }

%A }

%A //daemontest.c 结束///

%A 编译时使用命令进行联合编译:

%A gcc init_daemon.c daemontest.c

%A 产生了一个程序比如叫a.out

%A

%A 你就可以运行此程序了./a.out了。

%A

%A 如果想要此程序在系统启动时自动运行,你可以在/etc/rc.d/rc.local里面用su命令加上一行,比如:

%A su - Jacky -c "/bin/a.out"

%A 这个命令将以Jacky用户身份运行/bin/a.out程序

%A

%A 程序运行过程中如果你修改了程序的参数,则必然希望程序重新导入参数,那么你可以用ps命令查看程序的进程号:

%A ps -ef|grep a.out

%A 然后用kill命令向程序发参数,比如:

%A kill -s SIGUSR1 11422

%A

%A 同理,如果想要终止程序,则向程序发SIGUSR2信号:

%A kill -s SIGUSR2 11422%A%A

%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论

请登录...

登录后参与讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值