守护进程将fd0、1、2指向垃圾桶,无法正常查看其进程信息或调试信息。
void openlog(const char *ident, int option, int facility);openlog("a.out",LOG_PID|LOG_CONS,LOG_USER);
option是个宏操作操作选项,其中常用的为LOG_CONS将信息打印到控制台上,LOG_PID信息包含PID。facility也是个宏指什么类型的程序,LOG_AUTH安全类信息、LOG_CRON时间相关,LOG_USER一般用户信息等等
void syslog(int priority, const char *format, ...);syslog(LOG_INFO,"this is my log info");
首先就是priority就是重要优先级:
LOG_EMERG system is unusable 高优先级(系统挂了)LOG_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 低优先级(调试信息)
使用closelog()关闭调试信息。一般而言log调试信息在/var/log/messages中查看,ubuntu在/var/log/syslog中查看。操作系统中有一个守护进程syslogd在开机时启动,关机时关闭,负责进行日志文件的写入和维护。syslogd是独立的进程,可以用openlog()打开一个与syslogd相连的通道,通过syslog向syslogd发送信息,后由syslogd写入。任何进程都可以用syslogd写入日志文件,这是一种操作系统服务。
如何让母后程序不多次运行。守护进程在后台运行,本质上不需要多次打开,文件只需单例运行,如果这个进程已经在运行,则本次运行退出或提示已经在运行。其常用的方法为,去判断一个特定的文件是否存在,第一次运行时就去创建这个文件,文件应该是十分特别的文件,在关闭时就删除这个文件。
fd=open(FILENAME,U_RDWR|O_TRUNC|O_CREAT|O_EXCL,0664);(截断+创建+判断该名字的文件分是否存在)
if(fd<0){if(erron==EEXTST){//EEXTST对应的就是O_EXCLprintf("err 文件已经存在/n");exit(-1);}
}void delete_file(void)
{remove(FILENAME);
}atexit(delete_file);
当进程结束时会去自动运行atexit()函数,atexit()会在进程结束时去自动指向指向的注册函数,这个很析构。