日志:
系统运行时或者程序运行时会产生很多信息,通常将其保存于/var/log或者/usr/adm
UNIX规范提供了一个产生信息的接口
#include <syslog.h>
void syslog(int PRiority, const char *message, arguments...);
priority 是一个严重级别与一个设施值的按位或,根据不同的系统配置,不同的严重级别系统会做出不同的动作
严重级别:
LOG_EMERG 紧急情况
LOG_ALERT 高优先级故障
LOG_CRIT 严重错误
LOG_ERR 错误
LOG_WARNING 警告
LOG_NOTICE 需要注意的特殊情况
LOG_INFO 一般信息
LOG_DEBUG 调试信息
设施值:
LOG_USER,LOG_LOCAL0~LOG_LOCAL7
message、argument : 与printf的用法类似特别的%m可以插入与错误变量errno当前值对应的出错消息字符串
另有一些能够改变日志记录行为的函数
void closelog(void);
void openlog(const char *ident, int logopt, int facility);
int setlogmask(int maskpri);
ident: 设置该字符串,将会将该字符串加在每一条日志信息前
facility: 记录一个将被用于后续syslog调用的默认设施值
logopt: 对后续syslog调用的行为进行配置,它是0个或者多个下列参数的按位或
LOG_PID 在日志信息中包含进程标识符
LOG_CONS 如果信息不能被记录到日志文件中,就把他们发送到控制台
LOG_ODELAY 在第一次调用syslog时才打开日志设施(惰性开启)
LOG_NDELAY 立即打开日志设施,而不是等到第一次记录日志时
openlog会分配并打开一个文件描述符,通过closelog可以关闭它maskpri: 通过设置它来决定关注哪些等级的log
例:setlogmask(LOG_UPTO(LOG_NOTICE)); 只有严重程度在LOG_NOTICE之上的log才会被记录
#include <sys/types.h>#include <unistd.h>
pid_t getpid(void); //获得进程PID
pid_t getppid(void);//获得父进程PID
限制:
在linux系统上运行的程序会受到资源的限制,有来自硬件方面的物理限制,系统策略上的限制或具体实现的限制
在limits.h头文件中便定义了许多代表操作系统方面的限制的显式常量
例如:
NAME_MAX 文件名中的最大字符数
CHAR_BIT char类型值的位数
CHAR_MAX char类型的最大值
INT_MAX int类型的最大值
资源:
在头文件sys/resource.h中提供了资源操作方面的定义,其中包括对程序长度、执行优先级和文件资源等方面限制进行查询和设置的函数
#include <sys/resource.h>
//获得与优先级参数
int getpriority(int which, id_t who);//失败返回-1,由于-1也是一个有效优先级所以需要检查errno且在之前需要将errno设置为0
int setpriority(int which, id_t who, int priority);//失败返回-1,成功 0
which参数
PRIO_PROCESS who参数时进程标识符
PRIO_PGRP who参数是进程组
PRIO_USER who参数时用户标识符
priority参数: -20 ~ 20 负的优先级将会占用更多的CPU时间,普通用户只能降低程序的优先级,而不能升高
//获得与设置资源限制int getrlimit(int resource, struct rlimit *r_limit);
int setrlimit(int resource, const struct rlimit *r_limit);
resource参数:
RLIMIT_CORE 内核转储(core dump)文件的大小限制(字节为单位)
RLIMIT_CPU CPU时间限制(秒为单位)
RLIMIT_DATA 数据段限制(字节)
RLIMIT_FSIZE 文件大小限制(字节)
RLIMIT_NOFILE 可以打开的文件数限制
RLIMIT_STACK 栈大小限制(字节)
RLIMIT_AS 地址空间(栈和数据)限制(字节)
r_limit成员:
rlimit_t rlim_cur 当前的软限制
rlimit_t rlim_max 硬限制
//确定当前程序已耗费了多少CPU时间int getrusage(int who, struct rusage *r_usage);
who参数:
RUSAGE_SELF 仅返回当前程序的使用信息
RUSAGE_CHILDREN 还包括子进程的使用信息
r_usage结构体:
struct timeval ru_utime使用的用户时间 //用户时间和优先级有关
struct timeval ru_utime使用的系统时间 //一个同样程序的系统时间时固定的
新闻热点
疑难解答