作者:郭先2502898821_918 | 来源:互联网 | 2023-06-13 10:56
https:ote.youdao.comynoteshare1index.html?id704b0a1aa0f492a45b3a3828e478b5fa&typenote目录 一、
https://note.youdao.com/ynoteshare1/index.html?id=704b0a1aa0f492a45b3a3828e478b5fa&type=note
目录
一、使用syslog来记录调试信息
1、openlog、syslog、closelog函数
2、各种参数
ident:
option 、facility是一些宏定义
facility
priority
3、编程实战
4、总结
5、让程序不能被多次运行,即重复运行
问题
实现方法:
编程实战
一、使用syslog来记录调试信息
syslog 是一种工业标准的协议,用来记录设备的日志
1、openlog、syslog、closelog函数
openlog为当前的应用程序打开一个log文件
|
syslog用来记录一条信息
|
closelog用来关闭本程序的log文件
|
可以使用这三个函数,为系统文件写一条条的日志,用日志来做记录,日志信息就是一个文件,通过查看这个文件,就知道发生了什么事情,
/var/log/dmesg 内核引导信息日志
/var/log/message 标准系统错误信息日志
/var/log/maillog 邮件系统信息日志
/var/log/cron 计划任务日志
/var/log/secure 安全信息日志
而我们的ubuntu中是在/var/log/syslog文件中的,比如要查看ubuntu中的日志文件则:cat /var/log/syslog 即可。
2、各种参数
#include void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void);
|
指向信息的指针,一般为程序名,表示当前应用程序的名字,因为我们很多程序都会向日志文件写信息,日志信息是共用的,log要知道具体这一条是谁写的。
LOG_CONS:
LOG_PID:每一条信息里面加上PID,知道是哪个进程发的
因为父子进程的进程名字(ident)是一样的,必须要通过PID来区别
跟什么相关的信息,默认的LOG_USER,绝大多数用的这个。
日志信息的重要程度,共有8个紧张程度
一般用 LOG_INFO即可。
0: LOG_EMERG,紧急情况
1: LOG_ALERT,高优先级故障,例如数据库崩溃
2: LOG_CRIT,严重错误,例如硬件故障
3: LOG_ERR,错误
4: LOG_WARNING,警告
5: LOG_NOTICE,需要注意的特殊情况
6: LOG_INFO,一般信息
7: LOG_DEBUG,调试信息
3、编程实战
#include #include #include #include int main(void) { printf("my pid = %d.\n", getpid()); 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(); }
|
因为在Ubuntu中, log信息var/log/syslog文件中
其实系统中一直有一个守护进程syslogd,我们调用syslog函数,是给这个进程发消息,这个服务进程将消息保存在/ var/log/syslog文件中里面
用 cat /var/log/syslog 打开
4、总结
syslogd日志文件系统的服务器进程,提供日志服务,任何进程通过这三个函数跟syslogd通信,这就是OS提供的服务式的设计,FTP也是同理。
5、让程序不能被多次运行,即重复运行
(1)因为守护进程是长时间运行而不退出,因此./a.out执行一次就有一个进程,执行多次就有多个进程。
(2)这样并不是我们想要的。我们守护进程一般都是服务器,服务器程序只要运行一个就够了。
(3)因此我们希望我们的程序具有一个单例运行的功能。即当我们./a.out去运行程序时,不会重复执行程序。
用一个文件的存在与否来做标志。具体做法是程序在执行之初去判断一个特定的文件是否存在,若存在则标明进程已经在运行,若不存在则标明进程没有在运行。然后运行程序时去创建这个文件。当程序结束的时候去删除这个文件即可。
#include #include #include #include #include void delete(); #define FILE "/var/aliya_tset_single" int main(void) { int fd=-1; //fd file descriptor,文件描述符 //第一步:判断文件是否存在,若是,则报错,否建立 fd=open(FILE,O_CREAT|O_RDWR|O_TRUNC|O_EXCL,0664 ); if(fd<0) { if(errno == EEXIST) { printf("进程已经存在,请勿重复执行!\n"); return -1; } } //第二步:进程执行完毕后删除这个文件。 atexit(delete); int i=0; for(i=0;i<10;i++) { sleep(1); printf("running....%d\n",i); } } void delete() { remove(FILE);//删除文件 }
|