---常见守护进程
(1)syslogd,系统日志守护进程,提供syslog功能。
(2)cron,cron进程用来实现操作系统的时间管理,linux中实现定时执行程序的功能就要用到cron。
---编写简单守护进程
---任何一个进程都可以将自己实现成守护进程
---create_daemon函数要素
(1)子进程等待父进程退出
(2)子进程使用setsid创建新的会话期,脱离控制台
(3)调用chdir将当前工作目录设置为/
(4)umask设置为0以取消任何文件权限屏蔽
(5)关闭所有文件描述符
(6)将0、1、2定位到/dev/null
#include <sys/stat.h>
#include <fcntl.h>
- void create_daemon(void);
- int main(void)
{
create_daemon();
while (1)
{
printf("I am running.\n");
sleep(1);
}
return 0;
}
- // 函数作用就是把调用该函数的进程变成一个守护进程
void create_daemon(void)
{
pid_t pid = 0;
pid = fork();
if (pid < 0)
{
perror("fork");
exit(-1);
}
if (pid > 0)
{
exit(0); // 父进程直接退出
}
// 执行到这里就是子进程
// setsid将当前进程设置为一个新的会话期session,目的就是让当前进程
// 脱离控制台。
pid = setsid();
if (pid < 0)
{
perror("setsid");
exit(-1);
}
// 将当前进程工作目录设置为根目录
chdir("/");
// umask设置为0确保将来进程有最大的文件操作权限
umask(0);
// 关闭所有文件描述符
// 先要获取当前系统中所允许打开的最大文件描述符数目
int cnt = sysconf(_SC_OPEN_MAX);
int i = 0;
for (i=0; i<cnt; i++)
{
close(i);
}
open("/dev/null", O_RDWR); //
标准输入、 0open("/dev/null", O_RDWR); //
标准输出、 1open("/dev/null", O_RDWR); //
标准错误、 2}
---使用syslog来记录调试信息
---编程实战
(1)一般log信息都在操作系统的/var/log/messages这个文件中存储着,但是ubuntu中是在/var/log/syslog文件中的。
---syslog的工作原理
(1)操作系统中有一个守护进程syslogd(开机运行,关机时才结束),这个守护进程syslogd负责进行日志文件的写入和维护。
(2)syslogd是独立于我们任意一个进程而运行的。我们当前进程和syslogd进程本来是没有任何关系的,但是我们当前进程可以通过调用openlog打开一个和syslogd相连接的通道,然后通过syslog向syslogd发消息,然后由syslogd来将其写入到日志文件系统中。
(3)syslogd其实就是一个日志文件系统的服务器进程,提供日志服务。任何需要写日志的进程都可以通过openlog/syslog/closelog这三个函数来利用syslogd提供的日志服务。这就是操作系统的服务式的设计。
void openlog(const char *ident, int option, int facility); //打开日志
void syslog(int priority, const char *format, ...); //写日志 // 一般在
/var/log/messages这个文件 //ubuntu在/var/log/syslog文件void closelog(void); //关闭日志
*
ident:
NULL
直接就是当前程序的名字
option:
LOG_CONS //往日志里写的时候,如果出现错误,直接把信息输出到控制台
LOG_PID //在往日志发的每一条信息都带PID,为了区分父进程还是子进程的信息
facility:
LOG_AUTH security/authorization messages安全相关
LOG_CRON clock daemon (cron and at)时间相关
LOG_FTP ftp daemon FTP相关
LOG_USER(默认)generic user-level messages 普通的,一般的信息
priority:
LOG_EMERG system is unusableLOG_ALERT action must be taken immediatelyLOG_CRIT critical conditionsLOG_ERR error conditionsLOG_WARNING warning conditionsLOG_NOTICE normal, but significant, conditionLOG_INFO informational messageLOG_DEBUG debug-level message
openlog("b.out", LOG_PID | LOG_CONS, LOG_USER);
syslog(LOG_INFO, "this is my log info.%d", 23);
syslog(LOG_INFO, "this is another log info.");
syslog(LOG_INFO, "this is 3th log info.");
closelog();