程序员人生 网站导航

Linux daemon进程原理与使用

栏目:互联网时间:2015-05-12 09:00:26

甚么情况下用daemon进程

生产环境下,除我们ssh登录上去,然后手动跑的那部份之外,其他都是自动运行的,这些大部份都应当是后台履行的。如何才能后台履行呢?

  1. nohup ./XXX &
  2. 由系统的其他daemon进程启动。这样的话,你的程序是它的子进程,跟终端没关系。退出终端也不会致使进程退出。如写在crontab里。
  3. 写成daemon程序,可以手动履行,退出终端时程序不退出。

如何选择呢?
(1)首先,清算过期日志这1类需求,可以写1个死循环1直运行,也能够写在crontab里,每次履行完就退出(如果每分钟1次可以满足的话);
(2)crontab的需要接受最多1分钟的时延,如果实时性要求更高1些,那末就需要斟酌写个死循环了,这个程序可以由crontab来start和restart,只有在挂了重启时才会出现1分钟时延;
(3)服务不能中断的(nginx、redis、apache,所有在线服务),1般都是daemon程序。但理论上用(2)仿佛也能够;固然这二者细节上有很多区分。

怎样用daemon进程

linux C/C++可以直接调用int daemon(int, int)函数,不需要自己重新实现。
示例代码:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <iostream> int main(int argc, char *argv[]) { if (argc < 3) { printf("Usage: $0 no_ch_dir no_close_fd "); exit(0); } int no_ch_dir = atoi(argv[1]); int no_close_fd = atoi(argv[2]); std::cout << "main pid : " << getpid() << std::endl; std::cout << "main parent pid : " << getppid() << std::endl; std::cout << "main pwd : " << get_current_dir_name() << std::endl; if (daemon(no_ch_dir, no_close_fd) != 0) { // 1般都用daemon(0,0) // 成功返回0,失败返回⑴ // daemon(0,0):chdir到/,关闭0,1,2描写符。 std::cout << "stdout: daemon = ⑴" << std::endl; std::cerr << "stderr: daemon = ⑴" << std::endl; return 1; } std::cout << "stdout: daemon = 0" << std::endl; std::cerr << "stderr: daemon = 0" << std::endl; std::cout << "sub pid : " << getpid() << std::endl; std::cout << "sub parent pid : " << getppid() << std::endl; std::cout << "sub pwd : " << get_current_dir_name() << std::endl; while (1); return 0; }``` 编译运行:

[chenming@localhost ~]g++test1.cc?otest1[chenming@localhost ] ./test1
Usage: 0nochdirnoclosefd[chenming@localhost ] ./test1 0 0
main pid : 7896
main parent pid : 7573
main pwd : /home/chenming
[chenming@localhost ~]ps?ef|greptest194:chenming78647573516:09pts/000:00:16vimtest1.cc95:chenming789719316:14?00:00:18./test10097:chenming78997573716:15pts/000:00:00grep?inE

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐