Linux环境的日志资源和限制

  • 发布时间:2017-02-10 09:36:02
  • 作者:AlfredZhao
  • 标签:linux

日志:

系统运行时或者程序运行时会产生很多信息,通常将其保存于/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_LOCAL7message、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使用的系统时间 //一个同样程序的系统时间时固定的