Linux环境编程之进程(七):守护进程
来源:互联网 发布:jquery post json 编辑:程序博客网 时间:2024/05/16 11:45
守护进程也是一种进程,它由如下特性:
1、生存期较长,在系统自举时启动,仅在系统关闭时终止。
2、没有控制终端,在后台运行。
系统中有很多守护进程,它们执行日常事务活动。如日志进程syslogd、web服务器httpd、邮件服务器sendmail和数据块服务器mysqld等。大多数守护进程都是以超级用户(用户ID为0)特权运行。没有一个守护进程具有控制终端,其终端设置为问号(?),终端前台进程组ID设置为-1。内核守护进程以无控制终端方式启动。用户层守护进程缺少控制终端可能是守护进程调用了setsid的结果。所有用户层守护进程都是进程组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程。最后,大多数守护进程的父进程是init进程。
(一)编程规则
1、调用umask将文件模式创建屏蔽字设置为0。
2、调用fork,然后使父进程退出(exit)。
3、调用setsid以创建一个新会话。使调用进程:a、成为新会话的首进程;b、成为一个新进程组的组长进程;c、没有控制终端。
4、将当前工作目录更改为根目录。
5、关闭不需要的文件描述符。
6、某些守护进程打开/dev/null使其具有文件描述符0、1和2。
(二)出错记录
因为守护进程没有控制终端,所以不能只是简单地写到标准出错上。那么该如何处理出错消息呢?我们不希望所有守护进程都写到控制台设备上,也不希望每个守护进程将它自己的出错消息写到一个单独的文件中,因为要关心哪一个守护进程写到哪一个记录文件中,并定期地检查这些文件,会很麻烦。所以,需要有一个集中的守护进程出错记录设施。
如上图所示,有3种方法产生日志消息:
1、内核例程可以调用log函数。任何一个用户进程通过打开(open)然后读(read)/dev/klog设备就可以读取这些消息。
2、大多数用户进程(守护进程)调用syslog函数以产生日志消息。//下面给出例子
3、在此主机上的一个用户进程,或通过TCP/IP网络连接到此主机的其他主机上的一个用户进程可将日志消息发向UDP端口514。
#include <syslog.h>
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
参数:
identity一般是程序的名称。
option参数是指定许多选项的位屏蔽。
priority参数是facility和level的组合。
(三)示例程序
/* *File Name : daemo.c *Autho : libing *Mail : libing1209@126.com */#include "stdio.h"#include "stdlib.h"#include <syslog.h>#include <fcntl.h>#include <signal.h>#include <sys/resource.h>int daemonize(void){int i, fd0, fd1, fd2;pid_tpid;struct rlimit rl;/* *调用umask将文件模式创建屏蔽字设置为0 */umask(0);/* *调用fork,然后使父进程退出(exit) */if((pid = fork()) < 0){printf("can't fork.");return -1;} else if(pid != 0) /*parent*/exit(0);setsid();//调用setsid以创建一个新会话/* *将当前工作目录更改为根目录 */if(chdir("/") < 0)printf("can't change directory to/");/* *Get maximum number of file descriptors. */if(getrlimit(RLIMIT_NOFILE, &rl) < 0)printf("can't get file limit.\n");/* *关闭不需要的文件描述符. */if(rl.rlim_max == RLIM_INFINITY)rl.rlim_max = 1024;for(i = 0; i < rl.rlim_max; i++)close(i);/* *守护进程打开/dev/null使其具有文件描述符0、1和2。 */fd0 = open("/dev/null", O_RDWR);fd1 = dup(0);fd2 = dup(0);return 0;}intmain(void){daemonize();openlog("daemotest", LOG_PID, LOG_USER);syslog(LOG_INFO, "program started.");while(1){sleep(1);}return 0;}
运行测试结果:
编译:gcc daemo.c -o daemotest运行:./daemotest测试:ps axj | grep daemotest1 6565 6565 6565 ? -1 Ss 1000 0:00 ./daemotest可以看出daemotest进程的父进程是1,没有终端控制(TTY选项为“?”)。其记录在/var/log/messages文件中,可以在该文件中找到"program started"字样的记录。
- Linux环境编程之进程(七):守护进程
- Linux进程控制编程之守护进程
- Unix 环境高级编程(APUE) 之 七 进程关系 和 守护进程
- linux 守护进程编程
- Linux编程---守护进程
- linux 守护进程编程
- linux守护进程编程
- linux守护进程编程
- Linux编程之会话与守护进程
- linux之守护进程与操作编程
- linux之守护进程
- Linux之守护进程
- Linux之守护进程
- Linux之守护进程
- Linux之守护进程
- Linux系统编程——特殊进程之守护进程
- Linux系统编程——特殊进程之守护进程
- 【Linux系统编程】特殊进程之守护进程
- 踏实和静心是一种习惯---读《编程之美》面试杂谈有感
- Hadoop学习笔记:Apache Hadoop生态系统
- 黑马程序员-Java基础知识4,(部分笔记总结面向对象-类)
- [leetcode]Word Break II
- hdu 4662 MU Puzzle
- Linux环境编程之进程(七):守护进程
- SQL两表之间:根据一个表的字段更新另一个表的字段
- SELinux的介绍
- nyoj 927 The partial sum problem
- hdu 4734 F(x)(DP)
- UICC/SIM/UIM/CSIM/RUIM
- 用户体验要素体会
- shell中,echo的颜色输出与光标定位
- leetcode-Valid Parentheses