免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1363 | 回复: 0
打印 上一主题 下一主题

守护进程和inetd超级服务器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-10 16:40 |只看该作者 |倒序浏览
守护进程是在后台运行且不与任何控制终端关联的进程。既然守护进程没有控制终端,当有事情发生时,它们得有输出消息的某种方法,syslog函数是输出这些消息的标准方法,它把这些消息发送给syslogd守护进程。
源自Berkeley的syslogd实现在启动时执行以下步骤:
1,读取配置文件。通常为/etc/syslog.conf的配置文件指定本守护进程可能收取的各种日志消息应该如何处理。
2,创建一个Unix域数据报套接口,给字捆绑路径名/var/run/log(在某些系统上是/dev/log)
3,创建一个UDP套接口,给它捆绑端口514(syslog服务使用的端口号)
4,打开路径名为/dev/klog。来自内核的任何出错消息看着像是这个设备的输入。
syslog守护进程在一个无限循环中运行:调用select以等待它的在2,3,4步中创建的描述字之一变为可读;读入日志消息,并按照配置文件进行处理。如果守护进程收到SIGHUP信号,那就重新读取配置文件。不过较新的syslogd实现禁止创建UDP套接口,除非管理员明确要求,因为允许任何进程往这个套接口发送UDP数据报造成系统易遭拒绝服务攻击。
syslog函数
既然守护进程没有控制终端,它们就不能把消息fprintf到sterr上,从守护进程中登记消息的常用技巧就是调用syslog函数。
#include
void syslog( int priority, const char *message, ... );
本函数的priority参数是级别(level)与设施(facility)两者的组合。message参数类似printf格式串,不过增设了%m规范,它将被替换成与当前errno值对应的出错消息。level的默认值是LOG_NOTICE,facility的缺省值为LOG_USER。举例来说,当rename函数调用失败时,守护进程可以执行以下调用:
syslog(LOG_INFO|LOG_LOCAL2,"rename(%s,%s):%m",file1,file2);
level与facility的目的在于,允许在/ect/syslog.conf文件中统一配置来自同一给定设施的所有消息,或者统一配置具有相同级别的所有消息。假如其具有以下两行:
kern.*         /dev/console
local7.debug   /var/log/cisco.log
这两行指定所有内核消息登记到控制台,来自local7设施的所有debug消息添加到文件/va/log/cisco.log的末尾。
daemon_init函数
此函数可以将一个一般的进程变为守护进程,它主完完成以下几步:
1,fork一个子进程,然后终止父进程。
2,调用setsid以创建一个新对话期。
3,将当前工作目录更改为根目录。
4,将文件方式创建屏蔽字设置为0。
5,关闭不再需要的文件描述符。
其代码如下:
#define MAXFD 64
extern int daemon_proc;
int daemon_init( const char *pname, int facility)
{
  int i;
  pid_t pid;
  if ((pid=fork())
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94142/showart_1896646.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP