Linux下能实现的守护进程代码为何在Unix系统下无法实现?

发布于 2022-10-15 07:36:55 字数 5467 浏览 18 评论 0

本帖最后由 冷寒生 于 2011-05-08 09:24 编辑

  1. //////////////////////////////init_daemon.c 开始///////////////////////////////////////////
  2. #include <unistd.h>
  3. #include <signal.h>
  4. #include <sys/param.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. /*********************************************************************
  8. *filename: init_daemon.c
  9. *purpose: 产生后台进程
  10. *wrote by: zhoulifa([email]zhoulifa@163.com[/email]) 周立发([url]http://zhoulifa.bokee.com[/url])
  11. *date time:2006-03-10 01:00:00
  12. *Thanks to: 北京工业大学 小胡(本文摘自[url]http://www.qtcn.org/bbs/simple/index.php?t116.html[/url])
  13. *Note: 任何人可以任意复制代码并运用这些代码,当然包括你的商业用途
  14. *                         但请遵循GPL
  15. *********************************************************************/
  16. void init_daemon(void)
  17. {
  18.   int pid;
  19.   int i;
  20.   if(pid=fork())
  21.     exit(0);//是父进程,结束父进程
  22.   else if(pid< 0)
  23.     exit(1);//fork失败,退出
  24.   //是第一子进程,后台继续执行
  25.   setsid();//第一子进程成为新的会话组长和进程组长
  26.   //并与控制终端分离
  27.   if(pid=fork())
  28.     exit(0);//是第一子进程,结束第一子进程
  29.   else if(pid< 0)
  30.     exit(1);//fork失败,退出
  31.   //是第二子进程,继续
  32.   //第二子进程不再是会话组长
  33.   for(i=0;i< NOFILE;++i)//关闭打开的文件描述符
  34.     close(i);
  35.   chdir("/tmp");//改变工作目录到/tmp
  36.   umask(0);//重设文件创建掩模
  37.   return;
  38. }
  39. //////////////////////////////init_daemon.c 结束///////////////////////////////////////////
  40. 上面这是个通用的函数,可以让你的程序成为后台守护进程。
  41. 下面是一个测试程序:
  42. //////////////////////////////daemontest.c 开始///////////////////////////////////////////
  43. #include <stdio.h>
  44. #include <time.h>
  45. /*********************************************************************
  46. *filename: daemontest.c
  47. *purpose: 测试后台进程
  48. *wrote by: zhoulifa([email]zhoulifa@163.com[/email]) 周立发([url]http://zhoulifa.bokee.com[/url])
  49. *date time:2006-03-10 01:09:00
  50. *Thanks to: 北京工业大学 小胡(本文参考了其文章[url]http://www.qtcn.org/bbs/simple/index.php?t116.html[/url])
  51. *Note: 任何人可以任意复制代码并运用这些代码,当然包括你的商业用途
  52. *                         但请遵循GPL
  53. *********************************************************************/
  54. void init_daemon(void);//守护进程初始化函数
  55. void signal_reload(int signal)
  56. {
  57.   /*当收到SIGUSR1信号时程序重新导入所有参数*/
  58.   FILE *fp;
  59.   time_t t;
  60.   if((fp=fopen("test.log","a")) >=0)
  61.   {
  62.     t=time(0);
  63.     fprintf(fp,"I received signal(%d), reload all parameters at %s\n", signal, asctime(localtime(&t)) );
  64.     fclose(fp);
  65.   }
  66.   /*重新导入参数*/
  67. }
  68. void signal_handle(int signal)
  69. {
  70.   /*当收到SIGUSR2信号时程序退出*/
  71.   FILE *fp;
  72.   time_t t;
  73.   if((fp=fopen("test.log","a")) >=0)
  74.   {
  75.     t=time(0);
  76.     fprintf(fp,"I received signal(%d), exit at %s\n", signal, asctime(localtime(&t)) );
  77.     fclose(fp);
  78.   }
  79.   exit(0);
  80. }
  81. int main(int argc, char ** argv)
  82. {
  83.   FILE *fp;
  84.   time_t t;
  85.   init_daemon();//初始化为Daemon
  86.   signal(SIGCHLD, SIG_IGN);/*忽略子进程退出信号,若在此之后又产生了子进程,
  87.                              如果不处理此信号,将在子进程退出后产生僵尸进程*/
  88.   signal(SIGUSR1, signal_reload);/*处理SIGUSR1信号,可以定义此信号为重导参数信号*/
  89.   signal(SIGUSR2, signal_handle);/*处理SIGUSR2信号,可以定义此信号为退出信号*/
  90.   while(1)//每隔一分钟向test.log报告运行状态
  91.   {
  92.     /*这是各位程序的主体部分,所以的工作在下面完成,比如http服务、FTP服务等*/
  93.     sleep(60);//睡眠一分钟
  94.     if((fp=fopen("test.log","a")) >=0)/*注意,由于在init_daemon里面已经把路径切换到了/tmp,因此此文件是/tmp/test.log*/
  95.     {
  96.       t=time(0);
  97.       fprintf(fp,"I'm here at %s\n",asctime(localtime(&t)) );
  98.       fclose(fp);
  99.     }
  100.   }
  101. }

复制代码以上代码引自 http://blog.chinaunix.net/space. ... =blog&id=296431

以上代码在Linux系统下可以成功执行,通过ps -ef可以看到运行的进程
但我在FreeBSD下却始终无法实现,请问题Linux环境编程和Unix环境编程是有一定区别的么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

嘦怹 2022-10-22 07:36:55

人品爆发了,以上这段代码我一直以为是Unix和Linux的实现方法不一样,结果是用错了ps命令。
在Linux下用ps -ef就可以查看守护进程,但在Unix下却是用ps –axj

最终测试结果:以上代码在Linux/Unix均能调试通过。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文