歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 一個Linux守候進程例子

一個Linux守候進程例子

日期:2017/2/28 16:17:58   编辑:Linux教程

其他程序可以調用void daemon_init(const char * cmd)方法,來初始化當前進程為守候進程

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<sys/resource.h>
  4. #include<fcntl.h>
  5. #include<signal.h>
  6. #include<syslog.h>
  7. void daemon_init(const char * cmd);
  8. int main(int argc, char * argv[])
  9. {
  10. daemon_init("liyachao_d");
  11. time_t ticks;
  12. while(1)
  13. {
  14. sleep(60);
  15. ticks = time(NULL);
  16. syslog(LOG_INFO,"%s",asctime(localtime(&ticks)));
  17. }
  18. return 0;
  19. }
  20. void daemon_init(const char * cmd)
  21. {
  22. int i;
  23. int fd0;
  24. int fd1;
  25. int fd2;
  26. pid_t pid;
  27. struct rlimit rl;
  28. struct sigaction sa;
  29. /*清空文件默認生成權限*/
  30. umask(0);
  31. /*取得最大的文件描述符*/
  32. if(getrlimit(RLIMIT_NOFILE,&rl) < 0 )
  33. {
  34. printf("can't get file limit.");
  35. }
  36. pid = fork();
  37. if(pid < 0 )
  38. {
  39. printf("fork error.");
  40. exit(1);
  41. }
  42. else if(pid > 0)
  43. {
  44. exit(0);
  45. }
  46. setsid();
  47. /*
  48. Ensure future opens won't allocate controlling TTYs.
  49. */
  50. sa.sa_handler =SIG_IGN;
  51. sigemptyset(&sa.sa_mask);
  52. sa.sa_flags = 0;
  53. if(sigaction(SIGHUP,&sa,NULL) < 0 )
  54. {
  55. printf("catn't ignore SIGHUP");
  56. exit(1);
  57. }
  58. pid = fork();
  59. if(pid < 0 )
  60. {
  61. printf("child fork error.");
  62. exit(1);
  63. }
  64. else if(pid > 0)
  65. {
  66. exit(0);
  67. }
  68. /*改變工作目錄到root*/
  69. if(chdir("/") < 0 )
  70. {
  71. printf("can't change directory to /");
  72. exit(1);
  73. }
  74. /*關閉所有的文件描述符*/
  75. if (rl.rlim_max == RLIM_INFINITY)
  76. {
  77. rl.rlim_max = 1024;
  78. }
  79. for (i = 0; i < rl.rlim_max; i++)
  80. {
  81. close(i);
  82. }
  83. /*重定向文件描述符0,1,2,到/dev/null*/
  84. fd0 = open("/dev/null",O_RDWR);
  85. fd1 = open("/dev/null",O_RDONLY);
  86. fd2 = open("/dev/null",O_RDWR);
  87. openlog(cmd, LOG_CONS, LOG_DAEMON);
  88. /*初始化日志文件*/
  89. if (fd0 != 0 || fd1 != 1 || fd2 != 2)
  90. {
  91. syslog(LOG_ERR, "unexpected file descriptors %d %d %d",fd0, fd1, fd2);
  92. exit(1);
  93. }
  94. }
Copyright © Linux教程網 All Rights Reserved