- 守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时启动,在系统关闭时终止。
- 所有守护进程都以超级用户(用户ID为0)的优先权运行。
- 守护进程没有控制终端。
- 守护进程的父进程都是init进程
1、 守护进程编程步骤
- 使用umask将文件模式创建屏蔽字设为0
- 调用fork,然后让父进程退出(exit)
- 调用setsia创建一个新会话
- 将当前工作目录更改为要目录
- 关闭不需要的文件描述符
2、 守护进程出错处理
- 由于守护进程完全脱离了控制终端,因此,不能像其它程序一样通过输出错误信息到控制台的方式来通知程序员。
- 通常办法是使用syslog服务,将出错信息输入到“/val/log/slog”系统日志文件中去。
- syslog是linux中的系统日志管理服务通过守护进程syslog来维护。
3、 syslog服务说明
- opnelog函数用于打开系统日志服务的一个连接
- syslog函数用于向日志文件中写入消息,在这里可以规定消息的优先级、消息的输出格式等。
- closelog函数用于关闭系统日志服务的连接
4、 相关操作函数
1)、openlog函数
#include <syslog.h>void openlog(const char *ident, int option, int facility);
功能:打开一个到系统日志记录程序的连接。
参数
- ident:要向每个消息加入的字符串,通常为程序的名称。
- option
- LOG_CONS 若日志消息不能通过发送到syslog,则将该消息写到控制台。
- LOG_NDELAY 立即打开linux域数据报套招口到syslog守护进程,通常,在记录第一条消息之前,该套接口不打开。
- LOG_PERROR 除将日志消息发送给syslog外,还将它写至stderrr.
- LOG_PID 每条消息都包含进程ID,此选择项可供对每个请求都fork一个子进程的守护进程使用。
- facility 指定记录消息的类型
标识 | 说明 |
---|---|
LOG_AUTH | 安全/授权消息 |
LOG_AUTHPRIV | 安全/授权消息(专用) |
LOG_CRON | 时钟守护进程(CRON和at) |
LOG_DAEMON | 系统守护进程,没有单独的设施值 |
LOG_FTP | 守护程序 |
LOG_KERN | 内核消息(这些消息不能从用户进程中生成) |
LOG_LOCAL0 through LOG_LOCAL7 | 保留供本地使用 |
LOG_LPR | 行式打印机子系统 |
LOG_MAIL | 邮件子系统 |
LOG_NEWS | 使用NET新闻子系统 |
LOG_SYSLOG | 由syslogd(8)内部生成的LOG_SYSLOG消息 |
LOG_USER | (默认)通用用户级消息 |
LOG_UUCP | UUCP子系统 |
2)、syslog和closelog函数
#include <syslog.h>void syslog(int priority, const char *format, ...);
void closelog(void);
参数
PRIORITY:消息优先级
标识 | 说明 |
---|---|
LOG_EMERG | 紧急(系统不可使用,最高优先级) |
LOG_ALERT | 必须立即修复的条件 |
LOG_CRIT | 临界条件(例如,硬设备出错) |
LOG_ERR | 出错条件 |
LOG_WARNING | 警告条件 |
LOG_NOTICE | 正常,但重要的条件 |
LOG_INFO | 信息性消息 |
LOG_DEBUG | 调试排错消息(最低优先级) |
5、示例代码
/*守护进程编程的5个步骤*/
//1、 创建屏蔽子为0
umask(0);
//2、 调用fork函数创建子进程,然后父进程退出
pid_t pid=fork();
if(pid>0) exit(0);
//3、 调用setsid函数创建一个新会话
setsid();
//4、 将当前工作目录更改为根目录
chdir("/");
//5、 关闭不需要的文件描述符
close(STDIN_FIENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);//打开日志
syslog(LOG_DEBUG,"write:%s \n",strerror(errno));